Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix DateTimeOffset Now and UtcNow #235

Merged
merged 4 commits into from
Mar 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/EFCore.Jet.Data/JetDataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,10 @@ public virtual DateTimeOffset GetDateTimeOffset(int ordinal)
{
return DateTimeOffset.Parse(stringValue, null, DateTimeStyles.RoundtripKind);
}
else if (value is DateTime dateTimeValue && dateTimeValue == JetConfiguration.TimeSpanOffset)
{
return default;
}
else if (value is DateTime dateTime)
{
return new DateTimeOffset(dateTime, TimeSpan.Zero);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
Expand Down Expand Up @@ -77,8 +78,18 @@ public class JetDateTimeMemberTranslator : IMemberTranslator
{
nameof(DateTime.Now) => _sqlExpressionFactory.Function("NOW", Array.Empty<SqlExpression>(),
false, new[] { false }, returnType),
nameof(DateTime.UtcNow) => _sqlExpressionFactory.Function("NOW", Array.Empty<SqlExpression>(),
false, new[] { false }, returnType),
nameof(DateTime.UtcNow) => _sqlExpressionFactory.Function(
"DATEADD",
new SqlExpression[]
{
new SqlConstantExpression(Expression.Constant("n"), null),
new SqlConstantExpression(Expression.Constant(-1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes), null) ,
_sqlExpressionFactory.Function("NOW", Array.Empty<SqlExpression>(),
false, new[] { false }, returnType)
},
true,
argumentsPropagateNullability: new[] { false, false, true },
returnType),
nameof(DateTime.Today) => _sqlExpressionFactory.Function(
"DATEVALUE",
new[]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ protected override void ConfigureParameter(DbParameter parameter)
// OLE DB can't handle the DateTimeOffset type.
if (parameter.Value is DateTimeOffset dateTimeOffset)
{
parameter.Value = dateTimeOffset.UtcDateTime;
parameter.Value = dateTimeOffset.Ticks == 0 ? DateTime.FromOADate(0) : dateTimeOffset.UtcDateTime;
parameter.DbType = System.Data.DbType.DateTime;
}

Expand All @@ -50,7 +50,7 @@ protected override string SqlLiteralFormatString
protected override string GenerateNonNullSqlLiteral(object value)
{
if (value is not DateTimeOffset offset) return base.GenerateNonNullSqlLiteral(value);
var dateTime = offset.UtcDateTime;
var dateTime = offset.Ticks == 0 ? DateTime.FromOADate(0) : offset.UtcDateTime;
return $"CDATE({string.Format(CultureInfo.InvariantCulture, DateTimeFormatConst, dateTime)})";
}
}
Expand Down
2 changes: 1 addition & 1 deletion test/EFCore.Jet.FunctionalTests/BuiltInDataTypesJetTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4902,7 +4902,7 @@ private void QueryBuiltInDataTypesTest<TEntity>(EntityEntry<TEntity> source)

if (entityType.FindProperty(nameof(BuiltInDataTypes.TestDateTimeOffset)) != null)
{
var param7 = new DateTimeOffset(new DateTime(), TimeSpan.FromHours(-8.0));
var param7 = new DateTimeOffset(new DateTime(), TimeSpan.FromHours(0.0));
Assert.Same(
entity,
set.Where(e => e.Id == 11 && EF.Property<DateTimeOffset>(e, nameof(BuiltInDataTypes.TestDateTimeOffset)) == param7)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_insert_query
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_perform_query_with_ansi_strings_test
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_perform_query_with_max_length
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_query_using_any_mapped_data_types_with_nulls
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_query_using_any_nullable_data_type_as_literal
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_query_using_DateDiffHour_using_TimeSpan
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_query_using_DateDiffMinute_using_TimeSpan
EntityFrameworkCore.Jet.FunctionalTests.BuiltInDataTypesJetTest.Can_query_using_DateDiffSecond_using_TimeSpan
Expand Down Expand Up @@ -14470,6 +14471,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_d
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_utcnow(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_year_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_year_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_now_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_now_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_and_optimized(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_and_optimized(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_or_optimized(isAsync: False)
Expand Down
18 changes: 18 additions & 0 deletions test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11072,8 +11072,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datet
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_minute_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_month_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_month_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_now(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_now(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_second_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_second_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_year_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_year_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(isAsync: False)
Expand Down Expand Up @@ -15664,6 +15668,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_d
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_utcnow(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_year_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetime_year_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_now_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_now_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow_component(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow_component(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_datetimeoffset_utcnow(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_and_optimized(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_and_optimized(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindWhereQueryJetTest.Where_de_morgan_or_optimized(isAsync: False)
Expand Down Expand Up @@ -17972,8 +17982,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_da
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_minute_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_now(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_now(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_second_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_second_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_year_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_year_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: False)
Expand Down Expand Up @@ -19771,8 +19785,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_da
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_minute_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_now(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_now(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_second_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_second_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_utcnow(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_year_component(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_year_component(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: False)
Expand Down
13 changes: 9 additions & 4 deletions test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2526,19 +2526,24 @@ public override async Task Where_datetimeoffset_now(bool isAsync)
await base.Where_datetimeoffset_now(isAsync);

AssertSql(
$@"SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Rating`, `m`.`Timeline`
"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE (`m`.`Timeline` <> SYSDATETIMEOFFSET()) OR SYSDATETIMEOFFSET() IS NULL");
WHERE `m`.`Timeline` <> NOW()
""");
}

public override async Task Where_datetimeoffset_utcnow(bool isAsync)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetimeoffset_utcnow(isAsync);

AssertSql(
$@"SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Rating`, `m`.`Timeline`
$"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE (`m`.`Timeline` <> CAST(SYSUTCDATETIME() AS datetimeoffset)) OR SYSUTCDATETIME() IS NULL");
WHERE `m`.`Timeline` <> DATEADD('n', {dtoffset}.0, NOW())
""");
}

public override async Task Where_datetimeoffset_date_component(bool isAsync)
Expand Down
27 changes: 17 additions & 10 deletions test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ WHERE NOW() <> CDATE({AssertSqlHelper.Parameter("@__myDatetime_0")})

public override async Task Where_datetime_utcnow(bool isAsync)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetime_utcnow(isAsync);

AssertSql(
Expand All @@ -795,21 +796,22 @@ public override async Task Where_datetime_utcnow(bool isAsync)

SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`
FROM `Customers` AS `c`
WHERE NOW() <> CDATE({AssertSqlHelper.Parameter("@__myDatetime_0")})
WHERE DATEADD('n', {dtoffset}.0, NOW()) <> CDATE({AssertSqlHelper.Parameter("@__myDatetime_0")})
""");
}

public override async Task Where_datetimeoffset_utcnow(bool async)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetimeoffset_utcnow(async);

AssertSql(
"""
@__myDatetimeOffset_0='2015-04-10T00:00:00.0000000-08:00'
$"""
@__myDatetimeOffset_0='2015-04-10T08:00:00.0000000Z' (DbType = DateTime)

SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]
FROM [Customers] AS [c]
WHERE CAST(SYSUTCDATETIME() AS datetimeoffset) <> @__myDatetimeOffset_0
SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`
FROM `Customers` AS `c`
WHERE DATEADD('n', {dtoffset}.0, NOW()) <> @__myDatetimeOffset_0
""");
}

Expand Down Expand Up @@ -935,19 +937,24 @@ public override async Task Where_datetimeoffset_now_component(bool isAsync)
await base.Where_datetimeoffset_now_component(isAsync);

AssertSql(
$@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`
"""
SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`
FROM `Orders` AS `o`
WHERE `o`.`OrderDate` = SYSDATETIMEOFFSET()");
WHERE `o`.`OrderDate` < NOW()
""");
}

public override async Task Where_datetimeoffset_utcnow_component(bool isAsync)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetimeoffset_utcnow_component(isAsync);

AssertSql(
$@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`
$"""
SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`
FROM `Orders` AS `o`
WHERE `o`.`OrderDate` = CAST(SYSUTCDATETIME() AS datetimeoffset)");
WHERE `o`.`OrderDate` <> DATEADD('n', {dtoffset}.0, NOW()) OR `o`.`OrderDate` IS NULL
""");
}

public override async Task Where_simple_reversed(bool isAsync)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3691,22 +3691,23 @@ public override async Task Where_datetimeoffset_now(bool async)
await base.Where_datetimeoffset_now(async);

AssertSql(
"""
SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline]
FROM [Missions] AS [m]
WHERE [m].[Timeline] <> SYSDATETIMEOFFSET()
"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE `m`.`Timeline` <> NOW()
""");
}

public override async Task Where_datetimeoffset_utcnow(bool async)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetimeoffset_utcnow(async);

AssertSql(
"""
SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline]
FROM [Missions] AS [m]
WHERE [m].[Timeline] <> CAST(SYSUTCDATETIME() AS datetimeoffset)
$"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE `m`.`Timeline` <> DATEADD('n', {dtoffset}.0, NOW())
""");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2942,22 +2942,23 @@ public override async Task Where_datetimeoffset_now(bool async)
await base.Where_datetimeoffset_now(async);

AssertSql(
"""
SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline]
FROM [Missions] AS [m]
WHERE [m].[Timeline] <> SYSDATETIMEOFFSET()
"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE `m`.`Timeline` <> NOW()
""");
}

public override async Task Where_datetimeoffset_utcnow(bool async)
{
var dtoffset = -1 * TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
await base.Where_datetimeoffset_utcnow(async);

AssertSql(
"""
SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline]
FROM [Missions] AS [m]
WHERE [m].[Timeline] <> CAST(SYSUTCDATETIME() AS datetimeoffset)
$"""
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
FROM `Missions` AS `m`
WHERE `m`.`Timeline` <> DATEADD('n', {dtoffset}.0, NOW())
""");
}

Expand Down
Loading