Округление DateDiff в SQL Server - PullRequest
       35

Округление DateDiff в SQL Server

3 голосов
/ 07 декабря 2010

У меня есть таблица с последней датой / временем, когда была запущена определенная функция.В моей хранимой процедуре я хочу вернуть 1, если текущая дата / время больше чем на час после последнего запуска, и 0, если оно было меньше.В настоящее время у меня есть это:

IF((SELECT TOP 1 DATEDIFF(HH,LastRunDateTime,GETDATE()) FROM myTable) >= 1)
BEGIN
    -- run statement to update LastRunDateTime
        return 1;
END
ELSE
    return 0;
END

Как округление работает с DateDiff?

Есть ли лучший способ вернуть 1, только если прошло больше часа?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Использование:

SELECT CASE 
         WHEN DATEDIFF(hh, LastRunDateTime, GETDATE()) >= 1 THEN 1 
         ELSE 0 
       END

Справка:

Как работает округление с DateDiff?

В разделе Границы даты в приведенной ссылке на документацию приведена такая информация.

1 голос
/ 08 декабря 2010

Я думаю, что вы хотите

IF DATEADD(hour, LastRunDateTime, 1) <= GETDATE() BEGIN
    RETURN 1;
END;
ELSE BEGIN
    RETURN 0;
END;

DateDiff немного более тонкий, чем просто вычитание двух datetime. Это на самом деле говорит вам, сколько «границ» пересекаются между ними. Например:

PRINT DATEDIFF(HH, '2010-12-07T03:59:59', '2010-12-07T04:00:00');
PRINT DATEDIFF(HH, '2010-12-07T04:00:00', '2010-12-07T04:59:59');

печатает следующее:

1
0

что сбивает с толку, потому что вторая пара datetime находится дальше друг от друга. Эта функциональность великолепна, когда вам это нужно, но нелогична, когда вам это не нужно.

...