Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 79a564f

Browse files
committed
Add precision support for MySql DateTime
1 parent 47b6851 commit 79a564f

File tree

2 files changed

+70
-30
lines changed

2 files changed

+70
-30
lines changed

src/ServiceStack.OrmLite.MySql/Converters/MySqlDateTimeConverterBase.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,23 @@ namespace ServiceStack.OrmLite.MySql.Converters
55
{
66
public abstract class MySqlDateTimeConverterBase : DateTimeConverter
77
{
8+
public int Precision { get; set; } = 0;
9+
10+
public override string ColumnDefinition => Precision == 0
11+
? "DATETIME"
12+
: $"DATETIME({Precision})";
13+
814
public override string ToQuotedString(Type fieldType, object value)
915
{
1016
/*
1117
* ms not contained in format. MySql ignores ms part anyway
1218
* for more details see: http://dev.mysql.com/doc/refman/5.1/en/datetime.html
1319
*/
1420
var dateTime = (DateTime)value;
15-
return DateTimeFmt(dateTime, "yyyy-MM-dd HH:mm:ss");
21+
var suffix = Precision > 0
22+
? "." + new string('f', Precision)
23+
: "";
24+
return DateTimeFmt(dateTime, "yyyy-MM-dd HH:mm:ss" + suffix);
1625
}
1726

1827
}

tests/ServiceStack.OrmLite.MySql.Tests/DateTimeColumnTest.cs

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
using NUnit.Framework;
66
using ServiceStack.DataAnnotations;
77
using ServiceStack.Model;
8+
using ServiceStack.OrmLite.Legacy;
9+
using ServiceStack.OrmLite.MySql.Converters;
10+
using ServiceStack.Text;
811

912
namespace ServiceStack.OrmLite.MySql.Tests
1013
{
@@ -15,52 +18,80 @@ public class DateTimeColumnTest
1518
[Test]
1619
public void Can_create_table_containing_DateTime_column()
1720
{
18-
using (var db = OpenDbConnection())
19-
{
20-
db.CreateTable<Analyze>(true);
21-
}
21+
using var db = OpenDbConnection();
22+
db.CreateTable<Analyze>(true);
2223
}
2324

2425
[Test]
2526
public void Can_store_DateTime_Value()
2627
{
27-
using (var db = OpenDbConnection())
28-
{
29-
db.CreateTable<Analyze>(true);
28+
using var db = OpenDbConnection();
29+
db.CreateTable<Analyze>(true);
3030

31-
var obj = new Analyze {
32-
Id = 1,
33-
Date = DateTime.Now,
34-
Url = "http://www.google.com"
35-
};
31+
var obj = new Analyze {
32+
Id = 1,
33+
Date = DateTime.Now,
34+
Url = "http://www.google.com"
35+
};
3636

37-
db.Save(obj);
38-
}
37+
db.Save(obj);
3938
}
4039

4140
[Test]
4241
public void Can_store_and_retrieve_DateTime_Value()
4342
{
44-
using (var db = OpenDbConnection())
45-
{
46-
db.CreateTable<Analyze>(true);
43+
using var db = OpenDbConnection();
44+
db.CreateTable<Analyze>(true);
45+
46+
var obj = new Analyze {
47+
Id = 1,
48+
Date = DateTime.Now,
49+
Url = "http://www.google.com"
50+
};
4751

48-
var obj = new Analyze {
49-
Id = 1,
50-
Date = DateTime.Now,
51-
Url = "http://www.google.com"
52-
};
52+
db.Save(obj);
5353

54-
db.Save(obj);
54+
var id = (int)db.LastInsertId();
55+
var target = db.SingleById<Analyze>(id);
5556

56-
var id = (int)db.LastInsertId();
57-
var target = db.SingleById<Analyze>(id);
57+
Assert.That(target, Is.Not.Null);
58+
Assert.That(target.Id, Is.EqualTo(id));
59+
Assert.That(target.Date, Is.EqualTo(obj.Date).Within(TimeSpan.FromSeconds(1)));
60+
Assert.That(target.Url, Is.EqualTo(obj.Url));
61+
}
5862

59-
Assert.That(target, Is.Not.Null);
60-
Assert.That(target.Id, Is.EqualTo(id));
61-
Assert.That(target.Date, Is.EqualTo(obj.Date).Within(TimeSpan.FromSeconds(1)));
62-
Assert.That(target.Url, Is.EqualTo(obj.Url));
63+
[Test]
64+
public void Can_change_DateTime_precision()
65+
{
66+
using var db = OpenDbConnection();
67+
if (MySqlDialect.Provider.GetConverter(typeof(DateTime)) is MySqlDateTimeConverterBase dateConverter)
68+
{
69+
dateConverter.Precision = 3;
6370
}
71+
72+
OrmLiteUtils.PrintSql();
73+
db.CreateTable<Analyze>(true);
74+
75+
var obj = new Analyze {
76+
Id = 1,
77+
Date = DateTime.Now,
78+
Url = "http://www.google.com"
79+
};
80+
81+
db.Save(obj);
82+
83+
var id = (int)db.LastInsertId();
84+
var target = db.SingleById<Analyze>(id);
85+
target.PrintDump();
86+
87+
var q = db.From<Analyze>()
88+
.Where(x => x.Date >= DateTime.Now.Date);
89+
var results = db.Select(q);
90+
Assert.That(results.Count, Is.EqualTo(1));
91+
results.PrintDump();
92+
93+
results = db.SelectFmt<Analyze>("AnalyzeDate >= {0}", DateTime.Now.AddDays(-1));
94+
results.PrintDump();
6495
}
6596

6697
/// <summary>

0 commit comments

Comments
 (0)