From 381fe51575063830e134d3a16e7675cffd65083a Mon Sep 17 00:00:00 2001 From: tobybain Date: Tue, 2 Dec 2025 11:40:48 +0800 Subject: [PATCH] =?UTF-8?q?GBase=E5=9C=A8=E6=9D=A1=E4=BB=B6=E6=89=A7?= =?UTF-8?q?=E8=A1=8CDateTime=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C=E7=9A=84?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GBase/GBaseExpression/DateTimeTest.cs | 19 +++++++++++++------ .../FreeSql.Provider.GBase/GBaseExpression.cs | 16 +++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/GBaseExpression/DateTimeTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/GBaseExpression/DateTimeTest.cs index ae6892f06..020d7bdbe 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/GBaseExpression/DateTimeTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/GBaseExpression/DateTimeTest.cs @@ -400,17 +400,24 @@ namespace FreeSql.Tests.GBaseExpression data.Add(select.Where(a => a.CreateTime.AddMilliseconds(1) > DateTime.Now).ToList()); data.Add(select.Where(a => a.Type.Time.AddMilliseconds(1) > DateTime.Now).ToList()); data.Add(select.Where(a => a.Type.Parent.Time2.AddMilliseconds(1) > DateTime.Now).ToList()); - //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 - //FROM `tb_topic111333` a - //WHERE (date_add(a.`CreateTime`, interval (1) * 1000 microsecond) > now()); + // SELECT a.Id, a.Clicks, a.TypeGuid, a.Title, a.CreateTime,(a.CreateTime + ((1)/1000) units fraction) + // FROM tb_topic111333 a + // WHERE ((a.CreateTime + ((1)/1000) units fraction) > current) //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type //WHERE (date_add(a__Type.`Time`, interval (1) * 1000 microsecond) > now()); - //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 - //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent - //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) * 1000 microsecond) > now()) + // SELECT a.Id, a.Clicks, a.TypeGuid, a__Type.Guid, a__Type.ParentId, a__Type.Name, a__Type.Time, a.Title, a.CreateTime + // FROM tb_topic111333 a + // LEFT JOIN TestTypeInfo333 a__Type ON a__Type.Guid = a.TypeGuid + // WHERE ((a__Type.Time + ((1)/1000) units fraction) > current) + + // SELECT a.Id, a.Clicks, a.TypeGuid, a__Type.Guid, a__Type.ParentId, a__Type.Name, a__Type.Time, a.Title, a.CreateTime + // FROM tb_topic111333 a + // LEFT JOIN TestTypeInfo333 a__Type ON a__Type.Guid = a.TypeGuid + // LEFT JOIN TestTypeParentInf1 a__Type__Parent ON a__Type__Parent.Id = a__Type.ParentId + // WHERE ((a__Type__Parent.Time2 + ((1)/1000) units fraction) > current) } [Fact] public void AddMinutes() diff --git a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs index 5d57d1b5a..f211adb05 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs @@ -375,13 +375,15 @@ namespace FreeSql.GBase public override string ExpressionLambdaToSqlCallDateDiff(string memberName, Expression date1, Expression date2, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); + var d1 = getExp(date1); + var d2 = getExp(date2); switch (memberName) { - case "TotalDays": return $"({getExp(date1)}-{getExp(date2)})"; - case "TotalHours": return $"(({getExp(date1)}-{getExp(date2)})*24)"; - case "TotalMilliseconds": return $"(({getExp(date1)}-{getExp(date2)})*{24 * 60 * 60 * 1000})"; - case "TotalMinutes": return $"(({getExp(date1)}-{getExp(date2)})*{24 * 60})"; - case "TotalSeconds": return $"(({getExp(date1)}-{getExp(date2)})*{24 * 60 * 60})"; + case "TotalDays": return $"(({d1}-{d2}) / (1 units day))"; + case "TotalHours": return $"(({d1}-{d2}) / (1 units hour))"; + case "TotalMilliseconds": return $"((({d1}-{d2}) / (1 units fraction)) / 1000)"; + case "TotalMinutes": return $"(({d1}-{d2}) / (1 units minute))"; + case "TotalSeconds": return $"(({d1}-{d2}) / (1 units second))"; } return null; } @@ -414,11 +416,11 @@ namespace FreeSql.GBase { case "AddDays": return $"({left} + ({args1}) units day)"; case "AddHours": return $"({left} + ({args1}) units hour)"; - case "AddMilliseconds": return $"({left} + ({args1})/1000 units fraction)"; + case "AddMilliseconds": return $"({left} + (({args1})/1000) units fraction)"; case "AddMinutes": return $"({left} + ({args1}) units minute)"; case "AddMonths": return $"({left} + ({args1}) units month)"; case "AddSeconds": return $"({left} + ({args1}) units second)"; - case "AddTicks": return $"({left} + ({args1})/10000000 units fraction)"; + case "AddTicks": return $"({left} + (({args1})/10000000) units fraction)"; case "AddYears": return $"({left} + ({args1}) units year)"; case "Subtract": switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)