Как сгруппировать по дате с учетом часового пояса в linq2db (CONVERT_TZ)? - PullRequest
0 голосов
/ 27 января 2020

Скажем, у нас есть список действий для разных клиентов, сохраненный по дате. Дата сохраняется в ut c, и мы знаем часовой пояс клиента. Мы хотим знать количество активаций в день в часовом поясе клиента, принимая во внимание переход на летнее время.

В mysql мы можем использовать CONVERT_TZ(A.activity_date, 'UTC', S.timezone) As LocalDate и группировать по LocalDate.

В linq2db мы можем получить смещение часового пояса и добавить его к дате ut c, однако это не будет учитывать DST.

Есть ли в linq2db метод, который я еще не нашли, что могли сделать это? Если нет, есть ли способ создать метод, который будет отображаться в CONVERT_TZ в linq2db?

1 Ответ

2 голосов
/ 28 января 2020

Возможный способ сделать это - сопоставить метод 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();
}

Затем ConvertToTz может быть вызван как любой метод linq2db, например,

...GroupBy(a => ConvertToTz(a.ActivityDate, "UTC", "America/Montreal"))
.Select(g => new {
 Date = g.Key,
 Count = g.Count()
})
...