Работа с UTC, TimeZone и создание GROUP BY для этого с LocalTime - PullRequest
6 голосов
/ 22 июня 2011

Я застрял. Нужна помощь.

Я храню даты UTC в базе данных.

Пример строки:

GeneratedAt:

  • 2011-06-08 23: 30
  • 2011-06-09 03: 30
  • 2011-06-09 15: 30

Местное время для моего пользователя -2 часа (Центральная Европа). Когда я хочу строки с 09, тогда у меня есть 3 строки.

Проблема связана с днем ​​GROUP BY для целей отчетности. У меня есть 1 для 08 и 2 для 09, но это не верно для моего местного времени.

Везде, где я вижу: «хранить данные в UTC». Как это сделать правильно?

ОБНОВЛЕНИЕ 1:
Для доступа к данным я использую NHibernate и предпочитаю решение, не зависящее от ядра базы данных. Итак, я ищу решение с чем-то вроде таблицы измерения даты / времени (или чего-то подобного).

В моей таблице данных есть такие столбцы:

  • GeneratedAt (datetime)
  • GeneratedAt_Year (int)
  • GeneratedAt_Month (int)
  • GeneratedAt_Day (int)
  • GeneratedAt_Hour (int)

Благодаря этому я могу легко группировать по: год, год + месяц, год + месяц + день, год + месяц + день + час. К сожалению, это UTC. :(

Как реорганизовать это решение для работы с часовыми поясами пользователя?

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Вы можете создать представление этой таблицы, которое предоставляет значение datetime в желаемом часовом поясе Центральной Европы, применив функцию DATEADD.

Так что, если столбцы вашей таблицы: id, other_id, evt_time

тогда оператор выбора (для определения представления) будет:

SELECT id, other_id, evt_time, DATEADD( hh, -2, evt_time ) AS evt_time_ce
  FROM MyTable

тогда вы можете использовать вид и применить GROUP_BY к столбцу evt_time_ce

2 голосов
/ 23 июня 2011

У меня вообще похожая проблема, но разница во времени составляет 8 часов.

Я использую dateadd(hour, 8 , [Timestamp]), чтобы выбрать местное время, и dateadd(hour, -8 , @dateFrom) в предложениях WHERE - что должно работать дляGROUP BY также.

Например:

DECLARE @dateFrom datetime, @dateUntil datetime
SET @dateFrom =  '2011-06-20 00:00:02.000'
SET @dateUntil = '2011-06-22 10:00:00.000'

SELECT TOP 100
    dateadd(hour, 8, [Timestamp]) LocalTime, 
        *
FROM [Log] L (nolock)
WHERE L.[Timestamp] BETWEEN dateadd(hour, -8, @dateFrom) AND dateadd(hour, -8, @dateUntil)
ORDER BY LogID DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...