Skip to content

Commit 38dd2c9

Browse files
committed
Complete IComparable implementation for MySqlDataTime.
Add other interfaces and methods that are used for comparison. Signed-off-by: Bradley Grainger <[email protected]>
1 parent 159e190 commit 38dd2c9

File tree

11 files changed

+233
-6
lines changed

11 files changed

+233
-6
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
title: MySqlDateTime.Equals method
3+
---
4+
5+
# MySqlDateTime.Equals method
6+
7+
Returns `true` if this [`MySqlDateTime`](../../MySqlDateTimeType/) is equal to *obj*.
8+
9+
```csharp
10+
public override bool Equals(object obj)
11+
```
12+
13+
| parameter | description |
14+
| --- | --- |
15+
| obj | The object to compare against for equality. |
16+
17+
## Return Value
18+
19+
`true` if the objects are equal, otherwise `false`.
20+
21+
## See Also
22+
23+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
24+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
25+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
26+
27+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
title: MySqlDateTime.GetHashCode method
3+
---
4+
5+
# MySqlDateTime.GetHashCode method
6+
7+
Returns a hash code for this instance.
8+
9+
```csharp
10+
public override int GetHashCode()
11+
```
12+
13+
## See Also
14+
15+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
16+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
17+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
18+
19+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime Equality operator
3+
---
4+
5+
# MySqlDateTime Equality operator
6+
7+
```csharp
8+
public static bool operator ==(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime GreaterThan operator
3+
---
4+
5+
# MySqlDateTime GreaterThan operator
6+
7+
```csharp
8+
public static bool operator >(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime GreaterThanOrEqual operator
3+
---
4+
5+
# MySqlDateTime GreaterThanOrEqual operator
6+
7+
```csharp
8+
public static bool operator >=(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime Inequality operator
3+
---
4+
5+
# MySqlDateTime Inequality operator
6+
7+
```csharp
8+
public static bool operator !=(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime LessThan operator
3+
---
4+
5+
# MySqlDateTime LessThan operator
6+
7+
```csharp
8+
public static bool operator <(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: MySqlDateTime LessThanOrEqual operator
3+
---
4+
5+
# MySqlDateTime LessThanOrEqual operator
6+
7+
```csharp
8+
public static bool operator <=(MySqlDateTime left, MySqlDateTime right)
9+
```
10+
11+
## See Also
12+
13+
* struct [MySqlDateTime](../../MySqlDateTimeType/)
14+
* namespace [MySqlConnector](../../MySqlDateTimeType/)
15+
* assembly [MySqlConnector](../../../MySqlConnectorAssembly/)
16+
17+
<!-- DO NOT EDIT: generated by xmldocmd for MySqlConnector.dll -->

docs/content/api/MySqlConnector/MySqlDateTimeType.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ title: MySqlDateTime
77
Represents a MySQL date/time value. This type can be used to store `DATETIME` values such as `0000-00-00` that can be stored in MySQL (when [`AllowZeroDateTime`](../MySqlConnectionStringBuilder/AllowZeroDateTime/) is true) but can't be stored in a DateTime value.
88

99
```csharp
10-
public struct MySqlDateTime : IComparable, IConvertible
10+
public struct MySqlDateTime : IComparable, IComparable<MySqlDateTime>, IConvertible,
11+
IEquatable<MySqlDateTime>
1112
```
1213

1314
## Public Members
@@ -24,9 +25,17 @@ public struct MySqlDateTime : IComparable, IConvertible
2425
| [Month](../MySqlDateTime/Month/) { getset; } | Gets or sets the month. |
2526
| [Second](../MySqlDateTime/Second/) { getset; } | Gets or sets the second. |
2627
| [Year](../MySqlDateTime/Year/) { getset; } | Gets or sets the year. |
28+
| override [Equals](../MySqlDateTime/Equals/)(…) | Returns `true` if this [`MySqlDateTime`](../MySqlDateTimeType/) is equal to *obj*. |
2729
| [GetDateTime](../MySqlDateTime/GetDateTime/)() | Returns a DateTime value (if [`IsValidDateTime`](../MySqlDateTime/IsValidDateTime/) is `true`), or throws a [`MySqlConversionException`](../MySqlConversionExceptionType/). |
30+
| override [GetHashCode](../MySqlDateTime/GetHashCode/)() | Returns a hash code for this instance. |
2831
| override [ToString](../MySqlDateTime/ToString/)() | Converts this object to a String. |
32+
| [operator ==](../MySqlDateTime/op_Equality/) | |
2933
| [explicit operator](../MySqlDateTime/op_Explicit/) | Converts this object to a DateTime. |
34+
| [operator &gt;](../MySqlDateTime/op_GreaterThan/) | |
35+
| [operator &gt;=](../MySqlDateTime/op_GreaterThanOrEqual/) | |
36+
| [operator !=](../MySqlDateTime/op_Inequality/) | |
37+
| [operator &lt;](../MySqlDateTime/op_LessThan/) | |
38+
| [operator &lt;=](../MySqlDateTime/op_LessThanOrEqual/) | |
3039

3140
## See Also
3241

src/MySqlConnector/MySqlDateTime.cs

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace MySqlConnector
77
/// as <c>0000-00-00</c> that can be stored in MySQL (when <see cref="MySqlConnectionStringBuilder.AllowZeroDateTime"/>
88
/// is true) but can't be stored in a <see cref="DateTime"/> value.
99
/// </summary>
10-
public struct MySqlDateTime : IComparable, IConvertible
10+
public struct MySqlDateTime : IComparable, IComparable<MySqlDateTime>, IConvertible, IEquatable<MySqlDateTime>
1111
{
1212
/// <summary>
1313
/// Initializes a new instance of <see cref="MySqlDateTime"/>.
@@ -122,18 +122,52 @@ public readonly DateTime GetDateTime() =>
122122
/// <param name="val"></param>
123123
public static explicit operator DateTime(MySqlDateTime val) => !val.IsValidDateTime ? DateTime.MinValue : val.GetDateTime();
124124

125+
/// <summary>
126+
/// Returns <c>true</c> if this <see cref="MySqlDateTime"/> is equal to <paramref name="obj"/>.
127+
/// </summary>
128+
/// <param name="obj">The object to compare against for equality.</param>
129+
/// <returns><c>true</c> if the objects are equal, otherwise <c>false</c>.</returns>
130+
public override bool Equals(object? obj) =>
131+
obj is MySqlDateTime other && ((IEquatable<MySqlDateTime>) this).Equals(other);
132+
133+
/// <summary>
134+
/// Returns a hash code for this instance.
135+
/// </summary>
136+
public override int GetHashCode() =>
137+
#if NET45 || NET461 || NET471 || NETSTANDARD1_3 || NETSTANDARD2_0
138+
(((((Year * 33 ^ Month) * 33 ^ Day) * 33 ^ Hour) * 33 ^ Minute) * 33 ^ Second) * 33 ^ Microsecond;
139+
#else
140+
HashCode.Combine(Year, Month, Day, Hour, Minute, Second, Microsecond);
141+
#endif
142+
143+
public static bool operator ==(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) == 0;
144+
public static bool operator !=(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) != 0;
145+
public static bool operator <(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) < 0;
146+
public static bool operator <=(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) <= 0;
147+
public static bool operator >(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) > 0;
148+
public static bool operator >=(MySqlDateTime left, MySqlDateTime right) => ((IComparable<MySqlDateTime>) left).CompareTo(right) >= 0;
149+
125150
/// <summary>
126151
/// Compares this object to another <see cref="MySqlDateTime"/>.
127152
/// </summary>
128-
/// <param name="obj"></param>
153+
/// <param name="obj">The object to compare to.</param>
129154
/// <returns>An <see cref="Int32"/> giving the results of the comparison: a negative value if this
130155
/// object is less than <paramref name="obj"/>, zero if this object is equal, or a positive value if this
131156
/// object is greater.</returns>
132-
readonly int IComparable.CompareTo(object? obj)
133-
{
134-
if (!(obj is MySqlDateTime other))
157+
readonly int IComparable.CompareTo(object? obj) =>
158+
obj is MySqlDateTime other ?
159+
((IComparable<MySqlDateTime>) this).CompareTo(other) :
135160
throw new ArgumentException("CompareTo can only be called with another MySqlDateTime", nameof(obj));
136161

162+
/// <summary>
163+
/// Compares this object to another <see cref="MySqlDateTime"/>.
164+
/// </summary>
165+
/// <param name="other">The <see cref="MySqlDateTime"/> to compare to.</param>
166+
/// <returns>An <see cref="Int32"/> giving the results of the comparison: a negative value if this
167+
/// object is less than <paramref name="other"/>, zero if this object is equal, or a positive value if this
168+
/// object is greater.</returns>
169+
readonly int IComparable<MySqlDateTime>.CompareTo(MySqlDateTime other)
170+
{
137171
if (Year < other.Year)
138172
return -1;
139173
if (Year > other.Year)
@@ -161,6 +195,8 @@ readonly int IComparable.CompareTo(object? obj)
161195
return Microsecond.CompareTo(other.Microsecond);
162196
}
163197

198+
readonly bool IEquatable<MySqlDateTime>.Equals(MySqlDateTime other) => ((IComparable<MySqlDateTime>) this).CompareTo(other) == 0;
199+
164200
DateTime IConvertible.ToDateTime(IFormatProvider? provider) => IsValidDateTime ? GetDateTime() : throw new InvalidCastException();
165201
string IConvertible.ToString(IFormatProvider? provider) => IsValidDateTime ? GetDateTime().ToString(provider) : "0000-00-00";
166202

0 commit comments

Comments
 (0)