2012-05-09 2 views
4

Мне нужно сравнить 2 отдельных столбца, чтобы придумать самую последнюю дату между ними. Я использую DATEDIFF (минута, дата1, дата2), чтобы сравнить их, однако в некоторых записях дата Null, которая возвращает нулевой результат и испортит CASE.Как вы обрабатываете NULL в сравнении DATEDIFF?

Есть ли способ обойти это, или способ предопределить, какая дата равна нулю?

(psudocode)

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
+2

Зачем использовать lateiff вместо простого сравнения двух дат? Разве это не требует дополнительного времени обработки? – therealmitchconnors

+0

Поскольку вы новый пользователь на SO, вы должны принять ответ, если найдете его полезным. Потому что это дает ответчик впечатление, что они помогают вам не время. Некоторое время новый пользователь задает вопрос и оставляет его. – jams

ответ

3

Вы можете просто добавить дополнительную логику в вашем случае:

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE 
        WHEN d.date1 IS NULL THEN -- somewhat 
        WHEN d.date2 IS NULL THEN -- somewhat 
        WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
0

Вы можете попробовать некоторые думают, как это. Вы можете использовать Is Null, чтобы проверить значение null. Функция

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE Case When date2 Is Null Then GetDate() 
        Case When date1 Is Null Then GetDate() 
        WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 

от Microsoft ISNULL() используется, чтобы определить, как мы хотим, чтобы обработать NULL значения.

В этом случае мы хотим, чтобы значения NULL были равны нулю.

Ниже, если "UnitsOnOrder" является NULL это не повредит расчет, потому ISNULL() возвращает ноль, если значение NULL:

SQL Server/MS Access

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products 

SQL NULL Functions

0

Это должно дать вам то, что вы хотите, с минимальной необходимой обработкой.

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN COALESCE(date1, date2)>COALESCE(date2, date1) 
        THEN COALESCE(date1, date2) 
        ELSE COALESCE(date2, date1) 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
WHERE NOT (date1 is null and date2 is null); 
+0

Спасибо всем, кажется, у NULL есть это. Я закончил с использованием DATEDIFF (MINUTE, ISNULL (date1, 0), ISNULL (date2, 0))> = 1 THEN date2 ELSE date1 – user1385330

0

Я бы использовал ISNULL.

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN ISNULL(DATEDIFF(minute,d.date1,d.date2), 0) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 

или, может быть,

ISNULL(DATEDIFF(minute,d.date1,d.date2), 1) 

если вы хотите обработать нулевые значения наоборот.