Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Доброго времени!
В БД данные хранятся всегда в зимнем времени, а обрабатывать их необходимо с учетом поправки на зимнее/летнее время. Есть ли стандартная функция, определяющая какое сейчас время, или что-нибудь в этом роде?
31 мар 05, 14:19    [1430208]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
GetTimeZoneInformation
31 мар 05, 14:42    [1430345]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Anatoly Podgoretsky, извините за глупый вопрос, но как api-функцию можно использовать в tsql? Если можно, продемонстрируйте, пожалуйста, на примере.
31 мар 05, 14:56    [1430451]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
naPmu3aH
Member

Откуда: из лесу
Сообщений: 1449
Extended stored procedures?
--
чем дальше в лес, тем больше нас
31 мар 05, 15:13    [1430559]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Господа, уж извините меня за назойливость, но можно ли примерчик? Никогда с такими вещами не сталкивалась (ни api в tsql, ни Extended stored procedures), поэтому для меня это вызывает трудность. Не оставьте в беде, пожалуйста!
31 мар 05, 15:33    [1430643]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Aquarius
Member

Откуда:
Сообщений: 469
vot, navskidku iz BOL:
=====================================
GETUTCDATE
Returns the datetime value representing the current UTC time (Universal Time Coordinate or Greenwich Mean Time). The current UTC time is derived from the current local time and the time zone setting in the operating system of the computer on which SQL Server is running.

Syntax
GETUTCDATE()

Return Types
datetime

Remarks
GETUTCDATE is a nondeterministic function. Views and expressions that reference this column cannot be indexed.

GETUTCDATE cannot be called inside a user-defined function.
=======================================

mozhno sozdat' list Time Zones i napisat' funkciyu kotoraya budet vozvrashat vremya v korrektnoi time zone. A voobshe, naskolko ya pomnyu, Windows ne podderzhivaet "Automatically adjust clock for daylight saving changes" dlya mnogih Time Zones - galka prosto zadisablena.
Sorry esli ne v pomosh'.
1 апр 05, 01:53    [1432074]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Aquarius
Member

Откуда:
Сообщений: 469
ups, sorry
ne "...funkciyu..." napisat', a proceduru ;)
1 апр 05, 01:54    [1432075]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Aquarius, спасибо за помощь!
Я решила написать функцию, определяющую период летнего времени для определенного года и попала ли конкретная дата в этот период или нет.
Всем спасибо!
1 апр 05, 08:53    [1432311]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Вот что получилось в результате:
Create function PM_DaylightTime(@Custom_DT datetime)
returns bit
as
begin
Declare @DaylightTime_Start datetime, @DaylightTime_End datetime, @Result bit
select @DaylightTime_Start = case datepart(weekday,convert(datetime,'01.03.'+cast(YEAR(@Custom_DT) as varchar),104))
when 1 then convert(datetime,'29.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 2 then convert(datetime,'28.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 3 then convert(datetime,'27.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 4 then convert(datetime,'26.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 5 then convert(datetime,'25.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 6 then convert(datetime,'31.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 7 then convert(datetime,'30.03.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
end
select @DaylightTime_End = case datepart(weekday,convert(datetime,'01.10.'+cast(YEAR(@Custom_DT) as varchar),104))
when 1 then convert(datetime,'29.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 2 then convert(datetime,'28.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 3 then convert(datetime,'27.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 4 then convert(datetime,'26.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 5 then convert(datetime,'25.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 6 then convert(datetime,'31.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
when 7 then convert(datetime,'30.10.'+cast(YEAR(@Custom_DT) as varchar)+' 2:00:00',104)
end
If @Custom_DT >= @DaylightTime_Start and @Custom_DT < @DaylightTime_End Set @Result = 1 /* TRUE */
else Set @Result = 0 /* FALSE */
return @Result
end
Критика приветствуется

С уважением, Маринка
1 апр 05, 10:16    [1432558]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вах.
Для Эстонии

select case when datediff(hh,getutcdate(), getdate())=3 then 'summer' else 'winter' end
1 апр 05, 10:20    [1432582]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Или на всякий случай так

select case datediff(hh,getutcdate(), getdate()) when 3 then 'summer' when 2 then 'winter' end
1 апр 05, 10:23    [1432596]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory, очень красивое решение!
Только как его можно применить к какой-то определенной дате, а не getdate()?
1 апр 05, 12:10    [1433148]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
neal
Member

Откуда: Сердце Москвы
Сообщений: 492
Маринка*
Критика приветствуется


В принципе клево, но на самом деле существует более сложная система перехода на летнее время.

Это сейчас последнее воскресенье марта/последнее воскресенье октября в 2:00AM
Раньше было последнее воскресенье марта/последнее воскресенье сентября.
До этого было 1апреля/1октября.
До этого было не в 2:00AM, а в полночь.

Были исключения - когда переводились часы 19января 199x-какого то.

Еще декретное время.

Летом в годах 1918 - 1921 летнее время вводилось несколько раз наслоением и несколько раз отменялось и был период когда разница с Гринвичем была 5.5 часов!

В общем если Вы обрабатываете оперативные данные последних лет - то Ваш вариант неплох, но если что-то изменится или надо будет анализировать прошлое (далекое или не очень) то потребуется календарь перевода часов.

Даже есть такая книжка о разнице времени с Гринвичем для населенных пунктов бывшего СССР (с точными датами перевода часов).

Успехов!
-------------------------------------------------------
Отстаивая свои ограничения, ты лишаешь себя Всемогущества. (с) не мой
1 апр 05, 12:44    [1433297]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Маринка*
Glory, очень красивое решение!
Только как его можно применить к какой-то определенной дате, а не getdate()?

Если не известно значение getutcdate() на тот же момент то никак.
1 апр 05, 12:58    [1433373]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory
Если не известно значение getutcdate() на тот же момент то никак.

Тогда, к сожалению, этот вариант не подходит.

neal, спасибо за инфу! Мне, слава всем святым, нужно обрабатывать данные с начала этого года.
1 апр 05, 13:02    [1433395]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Мне, слава всем святым, нужно обрабатывать данные с начала этого года.
Тогда может просто <= '20050327 01:59:59.999' ?
1 апр 05, 13:07    [1433416]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory, этот вариант ну никак не прокатывает, ведь мне нужно обрабатывать данные с начала этого года, и дальше. У меня хранимка каждые полчаса запускается и обрабатывает данные, так что нужно автоматическое определение текущего времени (летнего/зимнего).
1 апр 05, 13:22    [1433489]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
ведь мне нужно обрабатывать данные с начала этого года, и дальше.

Не понял
case when @somedate between '20050101' and
'20050327 01:59:59.999' or @somedate between '20051029 01:59:59.999' and
'20051231 23:59:59.999' then ... end

так что нужно автоматическое определение текущего времени (летнего/зимнего).
Блин уже опять текущего. А пару постов назад было на произвольную дату.
1 апр 05, 13:27    [1433515]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory, уж извините, если запутала вас, объясняю: в хранимке данные обрабатываются за последние полчаса, например, с 13:00 до 13:30 при этом определяется, летнее сейчас время или зимнее, если летнее, то данные из определенной БД должны выбираться с поправкой. Но: иногда данные приходится пересчитывать за определенный период (например, если на тот момент был сбой), отсюда и произвольная дата, но и в этом случае нужно определять время.
То, что вы предлагаете
case when @somedate between '20050101' and
'20050327 01:59:59.999' or @somedate between '20051029 01:59:59.999' and
'20051231 23:59:59.999' then ... end

работает только для 2005 года, а какже дальше, каждый год переписывать код, определив летний период для конкретного года?
1 апр 05, 13:44    [1433616]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
работает только для 2005 года, а какже дальше, каждый год переписывать код, определив летний период для конкретного года?
Ну, ну уже тепло. Что надо сделать чтобы не переписывать каждый год процедуру ???
Правильно - создать табличку где будут занесены все периоды
1 апр 05, 13:54    [1433683]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Правильно - создать табличку где будут занесены все периоды
А не проще ли написать универсальную процедуру/функцию/запрос, решающий эту задачу, и забыть об этой проблеме?
1 апр 05, 13:59    [1433712]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Маринка*
Правильно - создать табличку где будут занесены все периоды
А не проще ли написать универсальную процедуру/функцию/запрос, решающий эту задачу, и забыть об этой проблеме?

А если завтра выйдет постановление об отмене переходов ? А послезавтра о восстановлении переходов ?
А если постановление будет об порядке перехода, например, переход осуществлять не в 2/3 часа а в 4/5 ?

А насчет универсиализации - правильнее было бы сохранять признак летнее/зимнее время в самой таблице на момент занесения записи.
1 апр 05, 14:10    [1433774]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory, вот что хочу сказать я по этому поводу:
во-первых, не думаю, что менять постановления будут каждый год, что уже неплохо, и даже, если и будут, то таблицу, которую вы предлагаете завести все равно менять придется, так какая разница менять таблицу или процедуру/функцию/запрос;
во-вторых, признак я ставить не могу, по любому, т.к. БД сия входит в состав системы, установленной на нашем предприятии другой фирмой, и трогать я эту БД никак не могу.
1 апр 05, 14:30    [1433920]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Glory
Member

Откуда:
Сообщений: 104760
так какая разница менять таблицу или процедуру/функцию/запрос;
Вводить две даты в табличку может любая тетенька. При этом можно будет и следить кто, что и когда вводил и отображать это всем кому надо показывать.

А вот для правки вашей универсальной функции придется звать вас и все, что вы там поменяете будет известно только вам.

Будете ли вы на месте в тот момент года когда выйдет постановление об отмене перехода или не будете, правильно вы перепишите функцию или не правильно - это уже у вашего начальства пусть болит голова.
1 апр 05, 14:41    [1434010]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли определить зимнее сейчас время или летнее?  [new]
Маринка*
Member

Откуда: Russia, Ryazan
Сообщений: 124
Glory
Вводить две даты в табличку может любая тетенька. При этом можно будет и следить кто, что и когда вводил и отображать это всем кому надо показывать.

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

Всем большое спасибо за внимание и участие.

Glory, отдельное вам спасибо, что подошли к моей проблеме со всей душой, можно сказать, как к своей.
1 апр 05, 14:52    [1434088]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить