2014-10-18 2 views
4

Я пытаюсь вычесть 2 даты друг от друга, но кажется, что это не вычитание правильно, и я не уверен, что я делаю неправильно здесь. Я использую регистр case для отметки как 1, если разница между датами составляет менее 90 дней, иначе отметьте ее как 0. Но она всегда помечена как 1, даже если разница между датами превышает 90 дней. Я PostgreSQL здесь и здесь мое дело заявление:Вычитание двух дат с использованием PostgreSQL

CASE WHEN EXTRACT(DAY FROM CAST(SVS_DT AS DATE) - CAST(DSCH_TS AS DATE)) <90 
     THEN 1 ELSE 0 END AS FU90 

пример дат здесь:

SVS_DT       DSCH_TS 
2013-03-22 00:00:00   2010-05-06 00:00:00 

это, предполагают, чтобы пометить как 0 в этом случае, но она ослабевает, как 1, так как разница между этими двумя датами превышает 90 дней.

ответ

3

extract в день возвращает день элемент даты. Поскольку дни всегда между 1 и 31, максимальная разница составляет 30 и не может быть больше 90.

Вычитание date s возвращает разницу в днях как целое число. Таким образом, вам нужно только отбросить extract вызовы:

CASE WHEN (CAST(SVS_DT AS DATE) - CAST(DSCH_TS AS DATE)) < 90 THEN 1 
                   ELSE 0 
    END AS FU90 
+0

хорошо знать, спасибо человеку. – moe

1

вы можете использовать один ниже:

CASE WHEN (EXTRACT(EPOCH FROM (DATE_COLUMN_2 - DATE_COLUMN_1)) < (90*24*60*60) 
    THEN 1 ELSE 0 END AS FU90 

здесь он возвращает почтительность в секундах, так что вы должны преобразовать 90 дней в секундах

0

немного короче CAST версии.

SELECT CASE WHEN SVS_DT::DATE - DSCH_TS::DATE < 90 
    THEN 1 
    ELSE 0 
END 
AS FU90 
0

Мы также можем сделать это без использования какого-либо ЭКСТРАКТА или CAST ключевого слова, как:

SELECT CASE WHEN (DATE(SVS_DT)- DATE(DSCH_TS)) < 90 
      THEN 1 
     ELSE 0 
END AS FU90 
Смежные вопросы