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

Commit 638688e

Browse files
authored
add ToString format paramater support for MySql DateTime (#651)
* add ToString format paramater support for MySql DateTime * Add tests for DateTime.ToString() format parameter in Mysql
1 parent 81c07e9 commit 638688e

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

src/ServiceStack.OrmLite.MySql/MySqlExpression.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
namespace ServiceStack.OrmLite.MySql
22
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq.Expressions;
36
public class MySqlExpression<T> : SqlExpression<T>
47
{
58
public MySqlExpression(IOrmLiteDialectProvider dialectProvider)
6-
: base(dialectProvider) {}
9+
: base(dialectProvider) { }
710

811
protected override string ToCast(string quotedColName)
912
{
@@ -17,6 +20,24 @@ public override string ToDeleteRowStatement()
1720
: base.ToDeleteRowStatement();
1821
}
1922

23+
protected override object VisitColumnAccessMethod(MethodCallExpression m)
24+
{
25+
if (m.Method.Name == nameof(ToString) && m.Object?.Type == typeof(DateTime))
26+
{
27+
List<object> args = this.VisitExpressionList(m.Arguments);
28+
var quotedColName = Visit(m.Object);
29+
if (!IsSqlClass(quotedColName))
30+
quotedColName = ConvertToParam(quotedColName);
31+
32+
var statement = "";
33+
var arg = args.Count > 0 ? args[0] : null;
34+
if (arg == null) statement = ToCast(quotedColName.ToString());
35+
else statement = $"DATE_FORMAT({quotedColName.ToString()},'{arg.ToString()}')";
36+
return new PartialSqlString(statement);
37+
}
38+
return base.VisitColumnAccessMethod(m);
39+
}
40+
2041
protected override string CreateInSubQuerySql(object quotedColName, string subSelect)
2142
{
2243
return $"{quotedColName} IN (SELECT * FROM ({subSelect}) SubQuery)";

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

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,109 @@ public void Can_change_DateTime_precision()
101101
results.PrintDump();
102102
}
103103

104+
[Test]
105+
public void Can_query_DateTime_column_in_select_without_any_format_parameter()
106+
{
107+
using var db = OpenDbConnection();
108+
db.CreateTable<Analyze>(true);
109+
var obj = new Analyze
110+
{
111+
Id = 1,
112+
Date = DateTime.Now,
113+
Url = "http://www.google.com"
114+
};
115+
db.Save(obj);
116+
117+
var q=db.From<Analyze>().Select(i => i.Date);
118+
var sql = q.ToMergedParamsSelectStatement();
119+
var val= db.Select<DateTime>(q).First();
120+
Assert.That(obj.Date,Is.EqualTo(val).Within(TimeSpan.FromSeconds(1)));
121+
}
122+
123+
[Test]
124+
public void Can_query_DateTime_column_in_select_with_format_parameter()
125+
{
126+
using var db = OpenDbConnection();
127+
db.CreateTable<Analyze>(true);
128+
var obj = new Analyze
129+
{
130+
Id = 1,
131+
Date = DateTime.Now,
132+
Url = "http://www.google.com"
133+
};
134+
db.Save(obj);
135+
var q = db.From<Analyze>().Select(i => i.Date.ToString("%Y-%m-%d %H:%i:%s"));
136+
var sql = q.ToMergedParamsSelectStatement();
137+
var val = db.Select<string>(q).First();
138+
Assert.That(obj.Date, Is.EqualTo(DateTime.Parse(val)).Within(TimeSpan.FromSeconds(1)));
139+
}
140+
141+
[Test]
142+
public void Can_query_DateTime_column_in_where_with_format_parameter()
143+
{
144+
using var db = OpenDbConnection();
145+
db.CreateTable<Analyze>(true);
146+
var obj = new Analyze
147+
{
148+
Id = 1,
149+
Date = DateTime.Now,
150+
Url = "http://www.google.com"
151+
};
152+
var yesterdayString = obj.Date.AddDays(-1).ToString("yyyy-MM-dd");
153+
var todayString = obj.Date.ToString("yyyy-MM-dd");
154+
db.Save(obj);
155+
var q = db.From<Analyze>().Where(i=>i.Date.ToString("%Y-%m-%d")== yesterdayString);
156+
var results = db.Select<Analyze>(q);
157+
var sql = q.ToMergedParamsSelectStatement();
158+
Assert.That(results.Count, Is.EqualTo(0));
159+
160+
q = db.From<Analyze>().Where(i => i.Date.ToString("%Y-%m-%d") == todayString);
161+
results = db.Select<Analyze>(q);
162+
sql = q.ToMergedParamsSelectStatement();
163+
Assert.That(results.Count, Is.EqualTo(1));
164+
165+
var id = (int)db.LastInsertId();
166+
var target = db.SingleById<Analyze>(id);
167+
Assert.That(target, Is.Not.Null);
168+
Assert.That(target.Id, Is.EqualTo(id));
169+
Assert.That(target.Date, Is.EqualTo(obj.Date).Within(TimeSpan.FromSeconds(1)));
170+
Assert.That(target.Url, Is.EqualTo(obj.Url));
171+
}
172+
173+
[Test]
174+
public void Can_query_DateTime_column_in_select_and_where_with_format_parameter()
175+
{
176+
using var db = OpenDbConnection();
177+
db.CreateTable<Analyze>(true);
178+
var obj = new Analyze
179+
{
180+
Id = 1,
181+
Date = DateTime.Now,
182+
Url = "http://www.google.com"
183+
};
184+
var yesterdayString = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
185+
var todayString = DateTime.Now.ToString("yyyy-MM-dd");
186+
db.Save(obj);
187+
var q = db.From<Analyze>().Where(i => i.Date.ToString("%Y-%m-%d") == yesterdayString).Select(i=>i.Date.ToString("%Y-%m-%d"));
188+
var results = db.Select<string>(q);
189+
var sql = q.ToMergedParamsSelectStatement();
190+
Assert.That(results.Count, Is.EqualTo(0));
191+
192+
q = db.From<Analyze>().Where(i => i.Date.ToString() == yesterdayString).Select(i => i.Date.ToString("%Y-%m-%d"));
193+
results = db.Select<string>(q);
194+
sql = q.ToMergedParamsSelectStatement();
195+
Assert.That(results.Count, Is.EqualTo(0));
196+
197+
q = db.From<Analyze>().Where(i => i.Date.ToString("%Y-%m-%d") == todayString).Select(i => i.Date.ToString("%Y-%m-%d"));
198+
results = db.Select<string>(q);
199+
sql = q.ToMergedParamsSelectStatement();
200+
Assert.That(results.Count, Is.EqualTo(1));
201+
202+
var target = results.First();
203+
Assert.That(target, Is.Not.Null);
204+
Assert.That(target, Is.EqualTo(todayString));
205+
}
206+
104207
/// <summary>
105208
/// Provided by RyogoNA in issue #38 https://github.com/ServiceStack/ServiceStack.OrmLite/issues/38#issuecomment-4625178
106209
/// </summary>

0 commit comments

Comments
 (0)