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

Откуда:
Сообщений: 14
Имеется дата указанная в виде 6-значного числа (типа 733345), измеряемая в днях от 01.01.0001. (с учетом високосных годов) Подскажите как можно перевести в нормальный вид (типа 30.10.2008)?
30 окт 08, 16:06    [6377306]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
А сервер не 2008-й?
30 окт 08, 16:13    [6377349]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Vel
Member

Откуда: То там, то сям.
Сообщений: 420
Честр,

dateadd(day,@DaysCount,'1/1/1900')
30 окт 08, 16:13    [6377355]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
DECLARE @V INT;
SET @V=733345;
SELECT DATEADD(DAY,@V%146097,CAST(@V/146097*400+1 AS CHAR(4)));
30 окт 08, 16:21    [6377406]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
iap
DECLARE @V INT;
SET @V=733345;
SELECT DATEADD(DAY,@V%146097,CAST(@V/146097*400+1 AS CHAR(4)));
Чуть покороче:
DECLARE @V INT;
SET @V=733345;
SELECT DATEADD(DAY,@V%146097, STR(@V/146097*400+1));
30 окт 08, 16:32    [6377506]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Честр
Member

Откуда:
Сообщений: 14
iap,

спасибо огромное, работает!
а что за магическое число 146097?
30 окт 08, 16:42    [6377603]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Anddros
Member

Откуда:
Сообщений: 1077
declare @v int
set @v=733345
select dateadd(dd,@v-693596,'19000101')
30 окт 08, 16:44    [6377621]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Честр
iap,

спасибо огромное, работает!
а что за магическое число 146097?
Период Григорианского календаря (400 лет) в днях.
SELECT DATEDIFF(DAY,'2000','2400');
30 окт 08, 16:45    [6377626]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Anddros
declare @v int
set @v=733345
select dateadd(dd,@v-693596,'19000101')
Класс! Как же я сам не дотумкал?
30 окт 08, 16:51    [6377673]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
iap
Anddros
declare @v int
set @v=733345
select dateadd(dd,@v-693596,'19000101')
Класс! Как же я сам не дотумкал?
Хотя, возможно, будет врать из-за високосных/невисокосных лет? Зависимость-то нелинейная.
А 0001-й год - это не то же самое, что 1901-й. Тут напрашивается 2000-й вместо 1900-го.
30 окт 08, 16:55    [6377702]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Честр
Member

Откуда:
Сообщений: 14
да, ребята, спасибо вам за помощь!!!
30 окт 08, 16:56    [6377704]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Кстати, еще проще было бы не вычислять 'магическое число' 693596, а просто воспользоваться наводкой автора:
select dateadd(dd,@v-733345,'20081030')
Но хорошая мысля приходит опосля...
30 окт 08, 16:57    [6377711]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
iap
iap
Anddros
declare @v int
set @v=733345
select dateadd(dd,@v-693596,'19000101')
Класс! Как же я сам не дотумкал?
Хотя, возможно, будет врать из-за високосных/невисокосных лет? Зависимость-то нелинейная.
А 0001-й год - это не то же самое, что 1901-й. Тут напрашивается 2000-й вместо 1900-го.
declare @v int
set @v=733345
select dateadd(d,@v-730120,'2000')
30 окт 08, 17:01    [6377732]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Anddros
Member

Откуда:
Сообщений: 1077
iap
Хотя, возможно, будет врать из-за високосных/невисокосных лет? Зависимость-то нелинейная.
А 0001-й год - это не то же самое, что 1901-й. Тут напрашивается 2000-й вместо 1900-го.

Не, не будет. Это чистая разница в днях меж '00010101' и '19000101', вычисленная при помощи 733345 и 30.10.2008. Только вот непонятно теперь, зачем? :)
30 окт 08, 17:03    [6377742]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Anddros
iap
Хотя, возможно, будет врать из-за високосных/невисокосных лет? Зависимость-то нелинейная.
А 0001-й год - это не то же самое, что 1901-й. Тут напрашивается 2000-й вместо 1900-го.

Не, не будет. Это чистая разница в днях меж '00010101' и '19000101', вычисленная при помощи 733345 и 30.10.2008. Только вот непонятно теперь, зачем? :)
Дело в том, что 0100-й год - невисокосный. А 2000-й - високосный. 0400-й - високосный, а 2300=1900+400 - нет.
Получается, что после 01.03.2300 Ваша формула уже не будет правильной.
Так уж устроен Григорианский календарь! Период - именно 400 лет, и ни секундой меньше.
30 окт 08, 17:12    [6377811]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
Anddros
Member

Откуда:
Сообщений: 1077
iap
Дело в том, что 0100-й год - невисокосный. А 2000-й - високосный. 0400-й - високосный, а 2300=1900+400 - нет.
Получается, что после 01.03.2300 Ваша формула уже не будет правильной.
Так уж устроен Григорианский календарь! Период - именно 400 лет, и ни секундой меньше.

Дык что с того??? В MS об этом судя по всему отлично знают. :) И функции dateadd, datediff нормально с этим работают.
30 окт 08, 17:41    [6377994]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: конвертация  [new]
некропостер
Guest
Есть казначейская программа сэд (была, теперь у них суфд)
там тоже для хранения даты используется такое число.
Но также, в виде числа хранится время. Как ЕГО перевести в datetime с помощью SQL ?
Например,
426025437 это 11:50:02
627884353 это 17:26:28

В Delphi я конвертировал это число в TDateTime так: TDateTime = число / 864000000
Миллисекунды мне не нужны.

Использую MS SQL Server 2000
10 окт 12, 20:10    [13298696]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
некропостер
Guest
подниму тему вверх. может кто подскажет
11 окт 12, 00:20    [13299723]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
select cast(426025437 / 864000000. as datetime)
11 окт 12, 00:32    [13299768]     Ответить | Цитировать Сообщить модератору
 Re: конвертация  [new]
некропостер
Guest
хехе, а ведь я почти так пробовал, но без точки после 864000000 и получил 00:00:00)
спасибо!
11 окт 12, 08:42    [13300239]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить