From e20f5324a09eb18b0c888561fb64d0a4131e2470 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sun, 24 May 2020 04:15:10 +0800 Subject: [PATCH] update Expression DateTime ToString tests --- .../MySqlConnectorExpression/DateTimeTest.cs | 8 ++++- .../MySql/MySqlExpression/DateTimeTest.cs | 8 ++++- .../SqlServerExpression/DateTimeTest.cs | 11 +++++- .../MySql/MySqlExpression/DateTimeTest.cs | 8 ++++- .../SqlServerExpression/DateTimeTest.cs | 11 +++++- .../FreeSql.Provider.MySql/MySqlExpression.cs | 34 +++++++++---------- .../MySql/OdbcMySqlExpression.cs | 34 +++++++++---------- .../SqlServer/OdbcSqlServerExpression.cs | 5 ++- .../SqlServerExpression.cs | 5 ++- 9 files changed, 83 insertions(+), 41 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/DateTimeTest.cs index 322c6673..5a31b774 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/DateTimeTest.cs @@ -62,7 +62,13 @@ namespace FreeSql.Tests.MySqlConnectorExpression //WHERE ((date_format(date_add(a__Type__Parent.`Time2`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') = now())) g.mysql.Insert(new Topic()).ExecuteAffrows(); - foreach (var dt in new[] { DateTime.Parse("2020-5-6 0:1:2"), DateTime.Parse("2020-11-16 13:21:22"), }) + var dtn = DateTime.Parse("2020-1-1 0:0:0"); + var dts = Enumerable.Range(1, 12).Select(a => dtn.AddMonths(a)) + .Concat(Enumerable.Range(1, 31).Select(a => dtn.AddDays(a))) + .Concat(Enumerable.Range(1, 24).Select(a => dtn.AddHours(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddMinutes(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddSeconds(a))); + foreach (var dt in dts) { Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), select.First(a => dt.ToString())); Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss"), select.First(a => dt.ToString("yyyy-MM-dd HH:mm:ss"))); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/DateTimeTest.cs index 3962227a..568ff4f2 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/DateTimeTest.cs @@ -62,7 +62,13 @@ namespace FreeSql.Tests.Odbc.MySqlExpression //WHERE ((date_format(date_add(a__Type__Parent.`Time2`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') = now())) g.mysql.Insert(new Topic()).ExecuteAffrows(); - foreach (var dt in new[] { DateTime.Parse("2020-5-6 0:1:2"), DateTime.Parse("2020-11-16 13:21:22"), }) + var dtn = DateTime.Parse("2020-1-1 0:0:0"); + var dts = Enumerable.Range(1, 12).Select(a => dtn.AddMonths(a)) + .Concat(Enumerable.Range(1, 31).Select(a => dtn.AddDays(a))) + .Concat(Enumerable.Range(1, 24).Select(a => dtn.AddHours(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddMinutes(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddSeconds(a))); + foreach (var dt in dts) { Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), select.First(a => dt.ToString())); Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss"), select.First(a => dt.ToString("yyyy-MM-dd HH:mm:ss"))); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/DateTimeTest.cs index fe70fe25..4eff3162 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/DateTimeTest.cs @@ -51,7 +51,13 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1).ToString().Equals(DateTime.Now)).ToList()); g.sqlserver.Insert(new Topic()).ExecuteAffrows(); - foreach (var dt in new[] { DateTime.Parse("2020-5-6 0:1:2"), DateTime.Parse("2020-11-16 13:21:22"), }) + var dtn = DateTime.Parse("2020-1-1 0:0:0"); + var dts = Enumerable.Range(1, 12).Select(a => dtn.AddMonths(a)) + .Concat(Enumerable.Range(1, 31).Select(a => dtn.AddDays(a))) + .Concat(Enumerable.Range(1, 24).Select(a => dtn.AddHours(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddMinutes(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddSeconds(a))); + foreach (var dt in dts) { Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss.fff"), select.First(a => dt.ToString())); Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss"), select.First(a => dt.ToString("yyyy-MM-dd HH:mm:ss"))); @@ -59,6 +65,9 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression Assert.Equal(dt.ToString("yyyy-MM-dd HH"), select.First(a => dt.ToString("yyyy-MM-dd HH"))); Assert.Equal(dt.ToString("yyyy-MM-dd"), select.First(a => dt.ToString("yyyy-MM-dd"))); Assert.Equal(dt.ToString("yyyy-MM"), select.First(a => dt.ToString("yyyy-MM"))); + Assert.Equal(dt.ToString("yyyyMMddHHmmss"), select.First(a => dt.ToString("yyyyMMddHHmmss"))); + Assert.Equal(dt.ToString("yyyyMMddHHmm"), select.First(a => dt.ToString("yyyyMMddHHmm"))); + Assert.Equal(dt.ToString("yyyyMMddHH"), select.First(a => dt.ToString("yyyyMMddHH"))); Assert.Equal(dt.ToString("yyyyMMdd"), select.First(a => dt.ToString("yyyyMMdd"))); Assert.Equal(dt.ToString("yyyyMM"), select.First(a => dt.ToString("yyyyMM"))); Assert.Equal(dt.ToString("yyyy"), select.First(a => dt.ToString("yyyy"))); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/DateTimeTest.cs index 201947fa..f41242d5 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/DateTimeTest.cs @@ -62,7 +62,13 @@ namespace FreeSql.Tests.MySqlExpression //WHERE ((date_format(date_add(a__Type__Parent.`Time2`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') = now())) g.mysql.Insert(new Topic()).ExecuteAffrows(); - foreach (var dt in new[] { DateTime.Parse("2020-5-6 0:1:2"), DateTime.Parse("2020-11-16 13:21:22"), }) + var dtn = DateTime.Parse("2020-1-1 0:0:0"); + var dts = Enumerable.Range(1, 12).Select(a => dtn.AddMonths(a)) + .Concat(Enumerable.Range(1, 31).Select(a => dtn.AddDays(a))) + .Concat(Enumerable.Range(1, 24).Select(a => dtn.AddHours(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddMinutes(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddSeconds(a))); + foreach (var dt in dts) { Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), select.First(a => dt.ToString())); Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss"), select.First(a => dt.ToString("yyyy-MM-dd HH:mm:ss"))); diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/DateTimeTest.cs index cae39dc7..48857b4d 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/DateTimeTest.cs @@ -59,7 +59,13 @@ namespace FreeSql.Tests.SqlServerExpression data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1).ToString().Equals(DateTime.Now)).ToList()); g.sqlserver.Insert(new Topic()).ExecuteAffrows(); - foreach (var dt in new[] { DateTime.Parse("2020-5-6 0:1:2"), DateTime.Parse("2020-11-16 13:21:22"), }) + var dtn = DateTime.Parse("2020-1-1 0:0:0"); + var dts = Enumerable.Range(1, 12).Select(a => dtn.AddMonths(a)) + .Concat(Enumerable.Range(1, 31).Select(a => dtn.AddDays(a))) + .Concat(Enumerable.Range(1, 24).Select(a => dtn.AddHours(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddMinutes(a))) + .Concat(Enumerable.Range(1, 60).Select(a => dtn.AddSeconds(a))); + foreach (var dt in dts) { Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss.fff"), select.First(a => dt.ToString())); Assert.Equal(dt.ToString("yyyy-MM-dd HH:mm:ss"), select.First(a => dt.ToString("yyyy-MM-dd HH:mm:ss"))); @@ -67,6 +73,9 @@ namespace FreeSql.Tests.SqlServerExpression Assert.Equal(dt.ToString("yyyy-MM-dd HH"), select.First(a => dt.ToString("yyyy-MM-dd HH"))); Assert.Equal(dt.ToString("yyyy-MM-dd"), select.First(a => dt.ToString("yyyy-MM-dd"))); Assert.Equal(dt.ToString("yyyy-MM"), select.First(a => dt.ToString("yyyy-MM"))); + Assert.Equal(dt.ToString("yyyyMMddHHmmss"), select.First(a => dt.ToString("yyyyMMddHHmmss"))); + Assert.Equal(dt.ToString("yyyyMMddHHmm"), select.First(a => dt.ToString("yyyyMMddHHmm"))); + Assert.Equal(dt.ToString("yyyyMMddHH"), select.First(a => dt.ToString("yyyyMMddHH"))); Assert.Equal(dt.ToString("yyyyMMdd"), select.First(a => dt.ToString("yyyyMMdd"))); Assert.Equal(dt.ToString("yyyyMM"), select.First(a => dt.ToString("yyyyMM"))); Assert.Equal(dt.ToString("yyyy"), select.First(a => dt.ToString("yyyy"))); diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 814d733b..134f26ba 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -394,21 +394,21 @@ namespace FreeSql.MySql case "Equals": return $"({left} = {args1})"; case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})"; case "ToString": - if (exp.Arguments.Count == 0) return $"date_format({left}, '%Y-%m-%d %H:%i:%s.%f')"; + if (exp.Arguments.Count == 0) return $"date_format({left},'%Y-%m-%d %H:%i:%s.%f')"; switch (args1) { - case "'yyyy-MM-dd HH:mm:ss'": return $"date_format({left}, '%Y-%m-%d %H:%i:%s')"; - case "'yyyy-MM-dd HH:mm'": return $"date_format({left}, '%Y-%m-%d %H:%i')"; - case "'yyyy-MM-dd HH'": return $"date_format({left}, '%Y-%m-%d %H')"; - case "'yyyy-MM-dd'": return $"date_format({left}, '%Y-%m-%d')"; - case "'yyyy-MM'": return $"date_format({left}, '%Y-%m')"; - case "'yyyyMMddHHmmss'": return $"date_format({left}, '%Y%m%d%H%i%s')"; - case "'yyyyMMddHHmm'": return $"date_format({left}, '%Y%m%d%H%i')"; - case "'yyyyMMddHH'": return $"date_format({left}, '%Y%m%d%H')"; - case "'yyyyMMdd'": return $"date_format({left}, '%Y%m%d')"; - case "'yyyyMM'": return $"date_format({left}, '%Y%m')"; - case "'yyyy'": return $"date_format({left}, '%Y')"; - case "'HH:mm:ss'": return $"date_format({left}, '%H:%i:%s')"; + case "'yyyy-MM-dd HH:mm:ss'": return $"date_format({left},'%Y-%m-%d %H:%i:%s')"; + case "'yyyy-MM-dd HH:mm'": return $"date_format({left},'%Y-%m-%d %H:%i')"; + case "'yyyy-MM-dd HH'": return $"date_format({left},'%Y-%m-%d %H')"; + case "'yyyy-MM-dd'": return $"date_format({left},'%Y-%m-%d')"; + case "'yyyy-MM'": return $"date_format({left},'%Y-%m')"; + case "'yyyyMMddHHmmss'": return $"date_format({left},'%Y%m%d%H%i%s')"; + case "'yyyyMMddHHmm'": return $"date_format({left},'%Y%m%d%H%i')"; + case "'yyyyMMddHH'": return $"date_format({left},'%Y%m%d%H')"; + case "'yyyyMMdd'": return $"date_format({left},'%Y%m%d')"; + case "'yyyyMM'": return $"date_format({left},'%Y%m')"; + case "'yyyy'": return $"date_format({left},'%Y')"; + case "'HH:mm:ss'": return $"date_format({left},'%H:%i:%s')"; } args1 = Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|ss|tt)", m => @@ -437,13 +437,13 @@ namespace FreeSql.MySql isMatched = true; switch (m.Groups[1].Value) { - case "m": return $"'), trim(leading '0' from date_format({left}, '%i')), date_format({left}, '"; - case "s": return $"'), trim(leading '0' from date_format({left}, '%s')), date_format({left}, '"; - case "t": return $"'), trim(trailing 'M' from date_format({left}, '%p')), date_format({left}, '"; + case "m": return $"'), case when substr(date_format({left},'%i'),1,1) = '0' then substr(date_format({left},'%i'),2,1) else date_format({left},'%i') end, date_format({left},'"; + case "s": return $"'), case when substr(date_format({left},'%s'),1,1) = '0' then substr(date_format({left},'%s'),2,1) else date_format({left},'%s') end, date_format({left},'"; + case "t": return $"'), trim(trailing 'M' from date_format({left},'%p')), date_format({left},'"; } return m.Groups[0].Value; }).Replace("%_a1", "%m").Replace("%_a2", "%s"); - return isMatched == false ? $"date_format({left}, {args1})" : $"concat(date_format({left}, {args1}))".Replace($"date_format({left}, '')", "''"); + return isMatched == false ? $"date_format({left},{args1})" : $"concat(date_format({left},{args1}))".Replace($"date_format({left},'')", "''"); } } return null; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index feaa5ca4..febf9323 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -394,21 +394,21 @@ namespace FreeSql.Odbc.MySql case "Equals": return $"({left} = {args1})"; case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})"; case "ToString": - if (exp.Arguments.Count == 0) return $"date_format({left}, '%Y-%m-%d %H:%i:%s.%f')"; + if (exp.Arguments.Count == 0) return $"date_format({left},'%Y-%m-%d %H:%i:%s.%f')"; switch (args1) { - case "'yyyy-MM-dd HH:mm:ss'": return $"date_format({left}, '%Y-%m-%d %H:%i:%s')"; - case "'yyyy-MM-dd HH:mm'": return $"date_format({left}, '%Y-%m-%d %H:%i')"; - case "'yyyy-MM-dd HH'": return $"date_format({left}, '%Y-%m-%d %H')"; - case "'yyyy-MM-dd'": return $"date_format({left}, '%Y-%m-%d')"; - case "'yyyy-MM'": return $"date_format({left}, '%Y-%m')"; - case "'yyyyMMddHHmmss'": return $"date_format({left}, '%Y%m%d%H%i%s')"; - case "'yyyyMMddHHmm'": return $"date_format({left}, '%Y%m%d%H%i')"; - case "'yyyyMMddHH'": return $"date_format({left}, '%Y%m%d%H')"; - case "'yyyyMMdd'": return $"date_format({left}, '%Y%m%d')"; - case "'yyyyMM'": return $"date_format({left}, '%Y%m')"; - case "'yyyy'": return $"date_format({left}, '%Y')"; - case "'HH:mm:ss'": return $"date_format({left}, '%H:%i:%s')"; + case "'yyyy-MM-dd HH:mm:ss'": return $"date_format({left},'%Y-%m-%d %H:%i:%s')"; + case "'yyyy-MM-dd HH:mm'": return $"date_format({left},'%Y-%m-%d %H:%i')"; + case "'yyyy-MM-dd HH'": return $"date_format({left},'%Y-%m-%d %H')"; + case "'yyyy-MM-dd'": return $"date_format({left},'%Y-%m-%d')"; + case "'yyyy-MM'": return $"date_format({left},'%Y-%m')"; + case "'yyyyMMddHHmmss'": return $"date_format({left},'%Y%m%d%H%i%s')"; + case "'yyyyMMddHHmm'": return $"date_format({left},'%Y%m%d%H%i')"; + case "'yyyyMMddHH'": return $"date_format({left},'%Y%m%d%H')"; + case "'yyyyMMdd'": return $"date_format({left},'%Y%m%d')"; + case "'yyyyMM'": return $"date_format({left},'%Y%m')"; + case "'yyyy'": return $"date_format({left},'%Y')"; + case "'HH:mm:ss'": return $"date_format({left},'%H:%i:%s')"; } args1 = Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|ss|tt)", m => @@ -437,13 +437,13 @@ namespace FreeSql.Odbc.MySql isMatched = true; switch (m.Groups[1].Value) { - case "m": return $"'), trim(leading '0' from date_format({left}, '%i')), date_format({left}, '"; - case "s": return $"'), trim(leading '0' from date_format({left}, '%s')), date_format({left}, '"; - case "t": return $"'), trim(trailing 'M' from date_format({left}, '%p')), date_format({left}, '"; + case "m": return $"'), case when substr(date_format({left},'%i'),1,1) = '0' then substr(date_format({left},'%i'),2,1) else date_format({left},'%i') end, date_format({left},'"; + case "s": return $"'), case when substr(date_format({left},'%s'),1,1) = '0' then substr(date_format({left},'%s'),2,1) else date_format({left},'%s') end, date_format({left},'"; + case "t": return $"'), trim(trailing 'M' from date_format({left},'%p')), date_format({left},'"; } return m.Groups[0].Value; }).Replace("%_a1", "%m").Replace("%_a2", "%s"); - return isMatched == false ? $"date_format({left}, {args1})" : $"concat(date_format({left}, {args1}))".Replace($"date_format({left}, '')", "''"); + return isMatched == false ? $"date_format({left},{args1})" : $"concat(date_format({left},{args1}))".Replace($"date_format({left},'')", "''"); } } return null; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index d8f7dc9b..23574cf3 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -388,9 +388,11 @@ namespace FreeSql.Odbc.SqlServer case "'yyyy'": return $"substring(convert(char(8), {left}, 112), 1, 4)"; case "'HH:mm:ss'": return $"convert(char(8), {left}, 24)"; } + var isMatched = false; var nchar = args1.StartsWith("N'") ? "N" : ""; - return Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|m|ss|s|tt|t)", m => + args1 = Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|m|ss|s|tt|t)", m => { + isMatched = true; switch (m.Groups[1].Value) { case "yyyy": return $"' + substring(convert(char(8), {left}, 112), 1, 4) + {nchar}'"; @@ -416,6 +418,7 @@ namespace FreeSql.Odbc.SqlServer } return m.Groups[0].Value; }); + return isMatched == false ? args1 : $"({args1})"; } } return null; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index b4b7c563..07ab621d 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -388,9 +388,11 @@ namespace FreeSql.SqlServer case "'yyyy'": return $"substring(convert(char(8), {left}, 112), 1, 4)"; case "'HH:mm:ss'": return $"convert(char(8), {left}, 24)"; } + var isMatched = false; var nchar = args1.StartsWith("N'") ? "N" : ""; - return Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|m|ss|s|tt|t)", m => + args1 = Regex.Replace(args1, "(yyyy|yy|MM|M|dd|d|HH|H|hh|h|mm|m|ss|s|tt|t)", m => { + isMatched = true; switch (m.Groups[1].Value) { case "yyyy": return $"' + substring(convert(char(8), {left}, 112), 1, 4) + {nchar}'"; @@ -414,6 +416,7 @@ namespace FreeSql.SqlServer } return m.Groups[0].Value; }); + return isMatched == false ? args1 : $"({args1})"; } } return null;