2010-12-07 1 views
3

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

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, если прошло больше часа?

+0

Здесь может быть более высокая производительность, и это более интуитивно понятно – 2010-12-07 20:23:40

ответ

2

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

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

Ссылка:

Как округлять работу с DateDiff?

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

1

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

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

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

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 

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

 Смежные вопросы

  • Нет связанных вопросов^_^