- 优化 DateTime.Subtract 统一得到秒差值;

This commit is contained in:
2881099
2024-11-01 22:16:54 +08:00
parent 1f855de7ff
commit 50919bbbf6
27 changed files with 23 additions and 50 deletions

View File

@@ -461,7 +461,6 @@ namespace FreeSql.ClickHouse
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"dateDiff(second, {args1}, toDateTime({left}))";
case "System.TimeSpan": return $"addSeconds(toDateTime({left}),(({args1})*-1))";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -150,7 +150,6 @@ namespace FreeSql.Custom
public virtual string LambdaDateTime_AddTicks(string operand, string value) => $"dateadd(second, ({value})/10000000, {operand})";
public virtual string LambdaDateTime_AddYears(string operand, string value) => $"dateadd(year, {value}, {operand})";
public virtual string LambdaDateTime_Subtract(string operand, string value) => $"datediff(second, {value}, {operand})";
public virtual string LambdaDateTime_SubtractTimeSpan(string operand, string value) => $"dateadd(second, ({value})*-1, {operand})";
public virtual string LambdaDateTime_Equals(string operand, string value) => $"({operand} = {value})";
public virtual string LambdaDateTime_CompareTo(string operand, string value) => $"datediff(second,{value},{operand})";
public virtual string LambdaDateTime_ToString(string operand) => $"convert(varchar, {operand}, 121)";

View File

@@ -365,7 +365,6 @@ namespace FreeSql.Custom
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return _utils.Adapter.LambdaDateTime_Subtract(left, args1);
case "System.TimeSpan": return _utils.Adapter.LambdaDateTime_SubtractTimeSpan(left, args1);
}
break;
case "Equals": return _utils.Adapter.LambdaDateTime_Equals(left, args1);

View File

@@ -217,7 +217,7 @@ namespace FreeSql.Custom.MySql
switch (exp.Member.Name)
{
case "Date": return $"cast(date_format({left},'%Y-%m-%d') as datetime)";
case "TimeOfDay": return $"timestampdiff(microsecond, date_format({left},'%Y-%m-%d'), {left})";
case "TimeOfDay": return $"timestampdiff(second, date_format({left},'%Y-%m-%d'), {left})";
case "DayOfWeek": return $"(dayofweek({left})-1)";
case "Day": return $"dayofmonth({left})";
case "DayOfYear": return $"dayofyear({left})";
@@ -417,12 +417,11 @@ namespace FreeSql.Custom.MySql
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})";
case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)";
case "System.DateTime": return $"timestampdiff(second, {args1}, {left})";
}
break;
case "Equals": return $"({left} = {args1})";
case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})";
case "CompareTo": return $"timestampdiff(second,{args1},{left})";
case "ToString":
if (exp.Arguments.Count == 0) return $"date_format({left},'%Y-%m-%d %H:%i:%s.%f')";
switch (args1)

View File

@@ -422,8 +422,7 @@ namespace FreeSql.Custom.Oracle
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"numtodsinterval(({left}+0)-({args1}+0),'day')";
case "System.TimeSpan": return $"({left}-{args1})";
case "System.DateTime": return $"((({left}+0)-({args1}+0))*{24 * 60 * 60})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -305,7 +305,7 @@ namespace FreeSql.Custom.PostgreSQL
switch (exp.Member.Name)
{
case "Date": return $"({left})::date";
case "TimeOfDay": return $"(extract(epoch from ({left})::time)*1000000)";
case "TimeOfDay": return $"extract(epoch from ({left})::time)";
case "DayOfWeek": return $"extract(dow from ({left})::timestamp)";
case "Day": return $"extract(day from ({left})::timestamp)";
case "DayOfYear": return $"extract(doy from ({left})::timestamp)";
@@ -511,8 +511,7 @@ namespace FreeSql.Custom.PostgreSQL
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)";
case "System.TimeSpan": return $"(({left})::timestamp-((({args1})/1000)||' milliseconds')::interval)";
case "System.DateTime": return $"extract(epoch from ({left})::timestamp-({args1})::timestamp)";
}
break;
case "Equals": return $"({left} = ({args1})::timestamp)";

View File

@@ -420,7 +420,6 @@ namespace FreeSql.Custom.SqlServer
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff(second, {args1}, {left})";
case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -422,8 +422,7 @@ namespace FreeSql.Dameng
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(cast({left} as timestamp with time zone)-{args1})";
case "System.TimeSpan": return $"({left}-{args1})";
case "System.DateTime": return $"((cast({left} as timestamp with time zone)-{args1})*{24 * 60 * 60})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -488,8 +488,7 @@ namespace FreeSql.Duckdb
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"cast((epoch({left})-epoch({args1}))||' seconds' as interval)";
case "System.TimeSpan": return $"date_add({left},{args1})";
case "System.DateTime": return $"(epoch({left})-epoch({args1}))";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -408,7 +408,6 @@ namespace FreeSql.Firebird
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff(second from {left} to {args1})";
case "System.TimeSpan": return $"dateadd(({args1})*-1 second to {left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -407,8 +407,7 @@ namespace FreeSql.GBase
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"({left} - {args1})";
case "System.TimeSpan": return $"({left} - {args1})";
case "System.DateTime": return $"(({left}-{args1})*{24 * 60 * 60})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -336,7 +336,7 @@ namespace FreeSql.KingbaseES
switch (exp.Member.Name)
{
case "Date": return $"({left})::date";
case "TimeOfDay": return $"(extract(epoch from ({left})::time)*1000000)";
case "TimeOfDay": return $"extract(epoch from ({left})::time)";
case "DayOfWeek": return $"extract(dow from ({left})::timestamp)";
case "Day": return $"extract(day from ({left})::timestamp)";
case "DayOfYear": return $"extract(doy from ({left})::timestamp)";
@@ -544,8 +544,7 @@ namespace FreeSql.KingbaseES
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)";
case "System.TimeSpan": return $"(({left})::timestamp-((({args1})/1000)||' milliseconds')::interval)";
case "System.DateTime": return $"extract(epoch from ({left})::timestamp-({args1})::timestamp)";
}
break;
case "Equals": return $"({left} = ({args1})::timestamp)";

View File

@@ -360,7 +360,6 @@ namespace FreeSql.MsAccess
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff('s', {args1}, {left})";
case "System.TimeSpan": return $"dateadd('s', ({args1})*-1, {left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -219,7 +219,7 @@ namespace FreeSql.MySql
switch (exp.Member.Name)
{
case "Date": return $"cast(date_format({left},'%Y-%m-%d') as datetime)";
case "TimeOfDay": return $"timestampdiff(microsecond, date_format({left},'%Y-%m-%d'), {left})";
case "TimeOfDay": return $"timestampdiff(second, date_format({left},'%Y-%m-%d'), {left})";
case "DayOfWeek": return $"(dayofweek({left})-1)";
case "Day": return $"dayofmonth({left})";
case "DayOfYear": return $"dayofyear({left})";
@@ -419,12 +419,11 @@ namespace FreeSql.MySql
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})";
case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)";
case "System.DateTime": return $"timestampdiff(second, {args1}, {left})";
}
break;
case "Equals": return $"({left} = {args1})";
case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})";
case "CompareTo": return $"timestampdiff(second,{args1},{left})";
case "ToString":
if (exp.Arguments.Count == 0) return $"date_format({left},'%Y-%m-%d %H:%i:%s.%f')";
switch (args1)

View File

@@ -150,7 +150,6 @@ namespace FreeSql.Odbc.Default
public virtual string LambdaDateTime_AddTicks(string operand, string value) => $"dateadd(second, ({value})/10000000, {operand})";
public virtual string LambdaDateTime_AddYears(string operand, string value) => $"dateadd(year, {value}, {operand})";
public virtual string LambdaDateTime_Subtract(string operand, string value) => $"datediff(second, {value}, {operand})";
public virtual string LambdaDateTime_SubtractTimeSpan(string operand, string value) => $"dateadd(second, ({value})*-1, {operand})";
public virtual string LambdaDateTime_Equals(string operand, string value) => $"({operand} = {value})";
public virtual string LambdaDateTime_CompareTo(string operand, string value) => $"datediff(second,{value},{operand})";
public virtual string LambdaDateTime_ToString(string operand) => $"convert(varchar, {operand}, 121)";

View File

@@ -366,7 +366,6 @@ namespace FreeSql.Odbc.Default
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return _utils.Adapter.LambdaDateTime_Subtract(left, args1);
case "System.TimeSpan": return _utils.Adapter.LambdaDateTime_SubtractTimeSpan(left, args1);
}
break;
case "Equals": return _utils.Adapter.LambdaDateTime_Equals(left, args1);

View File

@@ -217,7 +217,7 @@ namespace FreeSql.Odbc.MySql
switch (exp.Member.Name)
{
case "Date": return $"cast(date_format({left},'%Y-%m-%d') as datetime)";
case "TimeOfDay": return $"timestampdiff(microsecond, date_format({left},'%Y-%m-%d'), {left})";
case "TimeOfDay": return $"timestampdiff(second, date_format({left},'%Y-%m-%d'), {left})";
case "DayOfWeek": return $"(dayofweek({left})-1)";
case "Day": return $"dayofmonth({left})";
case "DayOfYear": return $"dayofyear({left})";
@@ -417,12 +417,11 @@ namespace FreeSql.Odbc.MySql
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})";
case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)";
case "System.DateTime": return $"timestampdiff(second, {args1}, {left})";
}
break;
case "Equals": return $"({left} = {args1})";
case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})";
case "CompareTo": return $"timestampdiff(second,{args1},{left})";
case "ToString":
if (exp.Arguments.Count == 0) return $"date_format({left},'%Y-%m-%d %H:%i:%s.%f')";
switch (args1)

View File

@@ -422,8 +422,7 @@ namespace FreeSql.Odbc.Oracle
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"numtodsinterval(({left}+0)-({args1}+0),'day')";
case "System.TimeSpan": return $"({left}-{args1})";
case "System.DateTime": return $"((({left}+0)-({args1}+0))*{24 * 60 * 60})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -305,7 +305,7 @@ namespace FreeSql.Odbc.PostgreSQL
switch (exp.Member.Name)
{
case "Date": return $"({left})::date";
case "TimeOfDay": return $"(extract(epoch from ({left})::time)*1000000)";
case "TimeOfDay": return $"extract(epoch from ({left})::time)";
case "DayOfWeek": return $"extract(dow from ({left})::timestamp)";
case "Day": return $"extract(day from ({left})::timestamp)";
case "DayOfYear": return $"extract(doy from ({left})::timestamp)";
@@ -511,8 +511,7 @@ namespace FreeSql.Odbc.PostgreSQL
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)";
case "System.TimeSpan": return $"(({left})::timestamp-((({args1})/1000)||' milliseconds')::interval)";
case "System.DateTime": return $"extract(epoch from ({left})::timestamp-({args1})::timestamp)";
}
break;
case "Equals": return $"({left} = ({args1})::timestamp)";

View File

@@ -420,7 +420,6 @@ namespace FreeSql.Odbc.SqlServer
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff(second, {args1}, {left})";
case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -422,8 +422,7 @@ namespace FreeSql.Oracle
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"numtodsinterval(({left}+0)-({args1}+0),'day')";
case "System.TimeSpan": return $"({left}-{args1})";
case "System.DateTime": return $"((({left}+0)-({args1}+0))*{24 * 60 * 60})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -336,7 +336,7 @@ namespace FreeSql.PostgreSQL
switch (exp.Member.Name)
{
case "Date": return $"({left})::date";
case "TimeOfDay": return $"(extract(epoch from ({left})::time)*1000000)";
case "TimeOfDay": return $"extract(epoch from ({left})::time)";
case "DayOfWeek": return $"extract(dow from ({left})::timestamp)";
case "Day": return $"extract(day from ({left})::timestamp)";
case "DayOfYear": return $"extract(doy from ({left})::timestamp)";
@@ -542,8 +542,7 @@ namespace FreeSql.PostgreSQL
case "Subtract":
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)";
case "System.TimeSpan": return $"(({left})::timestamp-((({args1})/1000)||' milliseconds')::interval)";
case "System.DateTime": return $"extract(epoch from ({left})::timestamp-({args1})::timestamp)";
}
break;
case "Equals": return $"({left} = ({args1})::timestamp)";

View File

@@ -456,7 +456,6 @@ namespace FreeSql.QuestDb
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff('s',{args1},{left})";
case "System.TimeSpan": return $"dateadd('s',({args1})*-1,{left})";
}
break;
case "Equals": return $"({left} = cast({args1} as timestamp))";

View File

@@ -467,7 +467,6 @@ namespace FreeSql.ShenTong
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff('second',{args1},{left})";
case "System.TimeSpan": return $"dateadd('second',({args1})*-1,{left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -419,7 +419,6 @@ namespace FreeSql.SqlServer
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff(second, {args1}, {left})";
case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -435,7 +435,6 @@ namespace FreeSql.Sqlite
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"(strftime('%s',{left})-strftime('%s',{args1}))";
case "System.TimeSpan": return $"datetime({left},(({args1})*-1)||' seconds')";
}
break;
case "Equals": return $"({left} = {args1})";

View File

@@ -468,7 +468,6 @@ namespace FreeSql.Xugu
switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
{
case "System.DateTime": return $"datediff(second, {args1}, {left})";
case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})";
}
break;
case "Equals": return $"({left} = {args1})";