Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Функция конвертации даты из POSIX в UTC..."
25.04.2005 21:48
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюФункция конвертации даты из POSIX в UTC

Юниксовые системы и многие проги (например, аська) пишут в лог время в формате POSIX, например, число 1114447770 ни о чем не скажет. А это 25 апреля 2005 года. Это число - число секунд, прошедших с 01.01.1970, начала так называемой "эры юникс". :) Не нашел в инете функций, пришлось написать свою.
Вот SQL-вариант ее (даже с поправкой на gmt).

CREATE FUNCTION convert_unix_date (
@count BIGINT,
@gmt INT)

RETURNS DATETIME

AS
BEGIN

DECLARE
@year AS INT,
@month AS INT,
@day AS INT,
@hour AS INT,
@min AS INT,
@sec AS INT,
@dy AS INT,
@dm AS INT

--Сделаем поправку на часовой пояс:
SET @count = @count + @gmt*3600

--Сначал отберем часы-минуты-секунды

SET @sec = @count % 60
SET @count = (@count - @sec)/60

SET @min = @count % 60
SET @count = (@count - @min)/60

SET @hour = @count % 24
SET @count = (@count - @hour)/24

--Компенсируем 1 день, т.к. учет начался с 1 число, а не с 0-го
SET @count = @count + 1
--Итого имеем сейчас в @count кол-во целых дней

SET @year = 1970 --Год начала эры юникс

WHILE @count >= 366
BEGIN
SET @dy = 365
IF (@year % 4) = 0 -- Если год високосный
SET @dy = 366

IF @count=@dy
SET @count = @count - 1 --Чтоб выйти из цикла

SET @count = @count - @dy
SET @year = @year + 1
END

--Условие, которые никак не смог запихнуть в цикл:
IF @count=366
SET @count = @count + 1

--Теперь имеем в @year текущий год, а в @count - кол-во оставшихся дней неполного года

SET @month=1

WHILE @count >= 28
BEGIN
SET @dm = 31
IF (@month =2) AND ( (@year % 4) = 0 )
SET @dm = 29
IF (@month =2) AND ( (@year % 4) != 0 )
SET @dm = 28
IF @month IN (4,6,9,11)
SET @dm = 30

IF @count<=@dm
BEGIN
SET @day=@count
SET @count=0
END
ELSE
BEGIN
SET @count = @count - @dm
SET @month = @month + 1
END
END

IF @count !=0
SET @day=@count

RETURN
CAST(CAST(@year AS varchar) + "-" + CAST(@month AS varchar) + "-" +CAST(@day AS varchar) + " " + CAST(@hour AS varchar) + ":" + CAST(@min AS varchar) + ":" + CAST(@sec AS varchar) AS DATETIME)

END