2013-08-21 1 views
2

У меня есть запрос, который использует функцию DateDiff SQL. Интервал возвращает min, hour или days в соответствии с тем, как я его помещал. Я хочу вернуть тип данных Datetime вместо результирующего целочисленного типа, как и он. Я попытался сделать это следующим образом.Как отбрасывать интервал функции DateDiff для типа данных SQL в Datetime

DATEDIFF(cast(MIN as datetime), b.FollowUpTime, a.FollowUpTime) 

Это возвращает ошибку. Я также пробовал

DATEDIFF(Convert(datetime,convert(char(8),MiNUTE)), b.FollowUpTime, a.FollowUpTime) 

Он также возвращает неверную ошибку параметра. Любая помощь будет оценена по достоинству. Спасибо

+2

Символ 'datetime' представляет собой неподвижную точку на временной шкале. Не интервал. Это логически разные типы данных. И если вы говорите о SQL Server, у него нет типа данных для представления интервала. 'DATEDIFF' возвращает' int '. –

+0

Спасибо, Дэмиен. Я понимаю, и мне интересно, есть ли способ, который я могу преобразовать «int s», чтобы его возвращение как DD: HH: MM: SS, HH: MM: формат SS вместо традиционного «int s» –

+0

Я с @Damien_The_Unbeliever, но для вашего требования вы можете получить 'DATEDIFF()' results 'в Seconds' и рассчитать дни, часы, минуты и отдых в секундах .... – Kaf

ответ

1

Вы можете использовать это, чтобы найти разницу между двумя датами:

SELECT 
    convert(VARCHAR, abs(datediff(second, @date1, @date2)/60/60/24)) 
    + ':' + 
    convert(VARCHAR, abs(((datediff(second, @date1, @date2)/60)/60) % 24)) 
    + ':' + 
    convert(VARCHAR, abs((datediff(second, @date1, @date2)/60) % 60)) 
    + ':' + 
    convert(VARCHAR, abs((datediff(second, @date1, @date2) % 60))) 

Вы просто должны изменить @date1 и @date2 с датами вам нужно.

Вот SQLFiddle where you can test this out.

Если вы действительно хотите преобразовать DateTime, используйте:

SELECT 
    convert(DATETIME, 
     (convert(VARCHAR, abs(((datediff(second, @date1, @date2)/60)/60) % 24)) 
     + ':' + 
     convert(VARCHAR, abs((datediff(second, @date1, @date2)/60) % 60)) 
     + ':' + 
     convert(VARCHAR, abs((datediff(second, @date1, @date2) % 60))) 
      ) 
    + dateadd(day, 
      abs(datediff(second, @date1, @date2)/60/60/24), 
      '01-01-1900 00:00:00') 
      ) 

Вот SQLFiddle for the second query

+0

Я думаю, что здесь может быть небольшой недостаток, если вы попытаетесь вернуть результирующую строку обратно в datetime, она возвращает '01 января 1900 00: 01: 00 + 0000'; не должно быть '01 января 1900 года 01: 00: 00 + 0000'?попал в эту слегка измененную скрипку http://sqlfiddle.com/#!3/d41d8/19290 – DrCopyPaste

+0

Вы хотите конвертировать 'РАЗ РАЗЛИЧИЯ' в' FIXED POINT' вовремя. Это неверно, как прокомментировал ранее Damien_The_Unbeliever. –

+0

Я не знаю, как вы можете использовать '01 января 1900 года 01: 00: 00 + 0000' в качестве разницы. –

0

Как указано в комментариях DATEDIFF возвращает INT значение разницы обеих дат.

С DATETIME основан на 1900-01-01, что означает «базовая дата», означающее, что от 0 до DATETIME приведет к значению 1900-01-01, вы можете добавить к нему разницу дат и получить значение относительное к этому моменту времени (1900-01-01).

Вот пример:

DECLARE @date1 DATETIME = GETUTCDATE() 
DECLARE @date2 DATETIME = DATEADD(DAY, -1, GETUTCDATE()) 

DECLARE @zeroDate DATETIME = 0 

SELECT DATEADD(SECOND, DATEDIFF(SECOND, @date1, @date2), @zeroDate) 

Я также настроить SQLFiddle, где вы можете попробовать это.