如何在考虑 linq2db (CONVERT_TZ) 中的时区的同时按日期分组?
How to group by date while taking into account the timezone in linq2db (CONVERT_TZ)?
假设我们有一个按日期保存的针对不同客户的活动列表。
日期以 utc 格式保存,我们知道客户的时区。
我们想知道客户所在时区每天的活动量,同时考虑夏令时。
在 mysql 中,我们可以使用 CONVERT_TZ(A.activity_date, 'UTC', S.timezone) As LocalDate
并按 LocalDate 分组。
在 linq2db 中,我们可以获得时区的偏移量并将其添加到 utc 日期,但是,这不会考虑 DST。
linq2db 中是否有我尚未发现的方法可以做到这一点?如果没有,有没有办法创建一个映射到 linq2db 中的 CONVERT_TZ
的方法?
一种可能的方法是将方法 CONVERT_TZ 映射到 C# 方法,如下所示:
[Sql.Function("CONVERT_TZ", ServerSideOnly = true)]
public static DateTime? ConvertToTz(DateTime? i_Date, string i_TzFrom, string i_TzTo)
{
throw new InvalidOperationException();
}
然后可以像调用任何 linq2db 方法一样调用 ConvertToTz,例如
...GroupBy(a => ConvertToTz(a.ActivityDate, "UTC", "America/Montreal"))
.Select(g => new {
Date = g.Key,
Count = g.Count()
})
假设我们有一个按日期保存的针对不同客户的活动列表。 日期以 utc 格式保存,我们知道客户的时区。 我们想知道客户所在时区每天的活动量,同时考虑夏令时。
在 mysql 中,我们可以使用 CONVERT_TZ(A.activity_date, 'UTC', S.timezone) As LocalDate
并按 LocalDate 分组。
在 linq2db 中,我们可以获得时区的偏移量并将其添加到 utc 日期,但是,这不会考虑 DST。
linq2db 中是否有我尚未发现的方法可以做到这一点?如果没有,有没有办法创建一个映射到 linq2db 中的 CONVERT_TZ
的方法?
一种可能的方法是将方法 CONVERT_TZ 映射到 C# 方法,如下所示:
[Sql.Function("CONVERT_TZ", ServerSideOnly = true)]
public static DateTime? ConvertToTz(DateTime? i_Date, string i_TzFrom, string i_TzTo)
{
throw new InvalidOperationException();
}
然后可以像调用任何 linq2db 方法一样调用 ConvertToTz,例如
...GroupBy(a => ConvertToTz(a.ActivityDate, "UTC", "America/Montreal"))
.Select(g => new {
Date = g.Key,
Count = g.Count()
})