2013-01-07 4 views
2

Мне нужно получить временные метки из таблиц Axapta в TSQL без учета часовой пояс и/или смещения дневного света-смещения за каждый раз, например, из таблицы JMGABSENCECALENDAR.UTC datetime offset

Принимая this в качестве первоначального подхода и сохраняя this, он работает в настоящее время. Но, считывая данные из таблицы, ссылаясь на другие временные метки, решение, представленное во второй ссылке, не получает информацию о дневном свете в указанное время.

Например:

добавить отсутствие на сегодняшний день (2012-01-07). Теперь, используя SSMS, чтение этого набора данных приводит к

STARTTIME = 2013-01-06 23:00:00.000 и EndTime = 2013-01-07 23:00:00.000

Это нормально, и я могу использовать

DECLARE @UTCOffset SMALLINT 

EXEC master..xp_regread 
    'HKEY_LOCAL_MACHINE', 
    'SYSTEM\CurrentControlSet\Control\TimeZoneInformation', 
    'ActiveTimeBias', 
    @UTCOffset OUTPUT 

SELECT DATEADD(MINUTE, @UTCOffset, GETDATE()) AS UTCTime 

, чтобы удалить смещение. Это работает отлично на фактические даты, но как правильно удалить офсет за прошлые или будущие времена, например 2012-07-01?

Здесь смещение составляет 120 минут, из-за летнего времени. Чтение Reg-Value возвращает только текущий офсет.

Задача должна быть решена в TSQL 2008

ответ

2

У меня была такая же проблема, но это было в совершенно иной обстановке. Я не имел никакого отношения к axapta. Тем не менее, у меня была проблема, что я должен был знать UTC смещение разных времен. Трудная часть здесь заключается в том, что разные страны используют другой подход к летнему времени, и поэтому разница в смещении может произойти в разных странах одновременно.

Что я сделал, так это создать таблицу поиска, в которой я установил даты изменения смещения UTC, это известные даты. Я дал ему столбец смещения, поэтому я мог бы легко найти смещение, которое мне нужно для определенной даты, используя оператор.

Это сработало для меня, может быть, это решение может предоставить вам что-то?

Ps. Вам не нужно искать смещение даты UTC из реестра. С помощью функции getutcdate() даст вам то же самое;) Пользуясь тем, что внутри DATADD делает его немного более удобным для чтения;)

Удачи и я надеюсь, что я мог бы внести свой вклад в вашу проблему ...

+0

Спасибо за ваш ответ - но таблица поиска не была моим первым выбором. Даты изменения UTC могут меняться от года к году, и я не хочу иметь таблицу anothe, которая нуждается в ежегодной поддержке;) +1 для информации, которую getutcdate() может заменить исправление! – Nico

+0

Нико, что я имел в виду с таким столом, так это то, что вы можете его генерировать один раз и использовать его в течение многих лет. В моем случае я мог бы создать таблицу, которая дала бы мне все периоды utc в течение 15 лет, что было более чем достаточно для этого клиента. –

0

Просто потому, что даты перехода на летнее время меняются из года в год, а состояние в состояние, ваш единственный жизнеспособный вариант - таблица поиска.

Вы можете найти данные для примера здесь http://www.timeanddate.com/time/dst/2013a.html

Однако, вы не могли бы сохранить, что список самостоятельно. timeanddate.com имеет калькулятор на своем сайте. Другие предлагают аналогичные услуги. Вы можете искать открытый API, а затем использовать несколько строк кода CLR для вызова этого API из своей базы данных.

Или вы можете использовать такую ​​услугу для хранения собственной копии этих данных. Наличие вашей собственной таблицы поиска будет, безусловно, самым быстрым решением.