Как поддержать bigint в datetime - PullRequest
4 голосов
/ 03 мая 2011

Результатом datediff(ss, '01/01/1970', '12/31/2050') является bigint, поэтому datediff переполнен.

Как мне получить значение bigint до его эквивалентной даты и обратно, если максимальная дата может быть в SQL равна int?

Мне нужно иметь возможность хранить количество секунд между 01/01/1970 и 12/31/2050 в SQL (что я и делаю как char), но преобразовать это значение в его календарную дату для отображения на веб-странице.

Любые идеи будут оценены.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 31 октября 2012

Это даст вам миллисекунды. Легко адаптируется к секундам ...

declare @dfrom datetime = '1970-01-01 16:15:33.021'
declare @dto datetime = '2058-01-01 15:00:55.557'

declare @diff bigint = 
    cast(DATEDIFF(d, @dfrom, @dto) as bigint) * 24 * 3600 * 1000 
     + DATEDIFF(ms, cast(@dfrom as time), cast(@dto as time))    

declare @dreverse datetime = 
    dateadd(ms, @diff % (1000 * 3600 * 24), 
        dateadd(day, @diff / (1000 * 3600 * 24), @dfrom))   

select @dfrom as [From], @dto as [To], @diff as [Diff], @dreverse as [Reverse] for xml path('')

дает:

<From>1970-01-01T16:15:33.020</From>
<To>2058-01-01T15:00:55.557</To>
<Diff>2777064322537</Diff>
<Reverse>2058-01-01T15:00:55.557</Reverse>
2 голосов
/ 04 мая 2011
CREATE FUNCTION dbo.SecondsSince1970(@date datetime)
RETURNS bigint
AS
BEGIN
    RETURN
        CASE WHEN @date > '2038-01-19'
            THEN CAST(DATEDIFF(ss, '2038-01-19', @date) AS bigint)
                + DATEDIFF(ss, '1970-01-01', '2038-01-19')
            ELSE DATEDIFF(ss, '1970-01-01', @date)
        END
END
2 голосов
/ 04 мая 2011

Вы можете указывать дату и время как число с плавающей точкой, где они будут обозначать количество дней с 1900-01-01 по 00:00:00.Части меньше суток - это просто дроби.Вычитать эти числа и масштабировать по секундам за день.

DECLARE @ d1 DATETIME

DECLARE @ d2 DATETIME

SELECT @ d1 = '01 / 01/1970 '

SELECT @ d2 = '12 / 31/2050 '

SELECT (CAST (@ d2 AS FLOAT) - CAST (@ d1 AS FLOAT)) *3600* 24

Но вы, вероятно, сможете найти более хорошие решения;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...