Приведение строк в даты рождения (которых нет в будущем) - PullRequest
0 голосов
/ 14 мая 2019

Я отливаю строки мм / дд / гг в даты в красном смещении, используя CAST AS DATE CAST(birth_str AS DATE) AS birth_date. Преобразование обрабатывает компоненты правильно, но год конвертируется в будущие времена всякий раз, когда он опускается ниже 1970 года. Например:

birth_str   birth_date
07/19/84    1984-07-19
02/07/66    2066-02-07
06/24/84    1984-06-24
01/31/64    2064-01-31
12/08/62    2062-12-08
02/21/36    2036-02-21
02/19/37    2037-02-19
07/01/74    1974-07-01
08/25/50    2050-08-25
08/31/39    2039-08-31

Есть ли лучшая практика, чтобы даты не попадали в будущее?

Нет ли аргументов для этого в актерском составе? (Я искал повсюду, но ничего не нахожу.) В противном случае, я предполагаю, что лучший путь вперед - это тестирование на дату приведения в будущем, а затем просто делать струнные операции над негодяями, прежде чем перевести их в разумные сроки.

В основном:

  • если не будущий день: отлично.
  • если будущая дата:
    • очистить все компоненты даты
    • шлепнуть 19 на yy
    • склеить все вместе
    • В ролях.

Это так хорошо, как это получается? (Я был немного удивлен, что не смог найти никого, кто придумал лучший способ обойти эту проблему).

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Есть ли лучшая практика?Абсолютно!Не храните даты в виде строк.Хранить даты как date.Вот почему SQL имеет собственные типы.

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

select (case when cast(birth_str AS DATE) < current_date
             then cast(birth_str AS DATE)
             else cast(birth_str AS DATE) - interval '100 year'
        end) as birth_date

Или, поскольку Redshift не может обрабатывать интервалы , вы можете перейтис этим:

SELECT (CASE
            WHEN birth_str::DATE < CURRENT_DATE
            THEN birth_str::DATE
            ELSE ADD_MONTHS(birth_str::DATE, -1200)
        END) AS birth_date
1 голос
/ 14 мая 2019

Вы можете применить CASE, чтобы проверить, что преобразованная ДАТА больше СЕГОДНЯ или нет.Если да, просто минус 100 лет от результатов, как показано ниже.

Один вопрос: есть ли вероятность иметь даты, например 21.02.14, которые могут относиться к 1900 или 2000 году?

SELECT 
CASE 
    WHEN CAST('02/21/36' AS DATE) >GETDATE() THEN DATEADD(YY,-100,CAST('02/21/36' AS DATE)) 
    ELSE CAST('02/21/36' AS DATE) 
END 
...