Функції дат і часу

Вступ до Redshift

Jason Myers

Principal Architect

Отримання поточної дати й часу

  • SYSDATE дата й час на початку транзакції
-- Отримати поточні дату й час
SELECT SYSDATE;
timestamp
============================
2024-01-27 20:05:55.976353
  • GETDATE() дата й час на початку оператора, потребує дужок
-- Отримати поточні дату й час
SELECT GETDATE();
timestamp
============================
2024-01-27 20:06:55.976353
Вступ до Redshift

Особливості функцій дат і часу

Обережно з функціями лише для leader node!

  • DATEDIFF замість AGE
  • GETDATE/SYSDATE замість функцій, специфічних для leader:
    • CURRENT_TIME
    • CURRENT_TIMESTAMP
    • ISFINITE
    • LOCALTIME
    • LOCALTIMESTAMP
    • NOW
Вступ до Redshift

Обрізання дат і часу

  • TRUNC повертає дату з мітки часу
-- Отримати поточну дату на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT TRUNC(SYSDATE);
2024-01-27
  • DATE_TRUNC('datepart', timestamp) обрізає до частини, як-от hour або day
-- Обрізати до хвилини на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT DATE_TRUNC('minute', SYSDATE);
2024-01-27 20:05:55
1 https://docs.aws.amazon.com/redshift/latest/dg/r_Dateparts_for_datetime_functions.html
Вступ до Redshift

Отримання частин дат і міток часу

  • DATE_PART(datepart, date or timestamp)
    • витягує потрібну частину з дати або мітки часу
-- Отримати поточний місяць на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT DATE_PART(month, SYSDATE);
1
  • Повертає не лише month, day, year
    • Приклади: dayofweek, quarter, timezone
-- Отримати день тижня на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT DATE_PART(dayofweek, SYSDATE);
6
Вступ до Redshift

Порівняння дат і часу

  • DATE_CMP(date_1, date_2) відносне порівняння

    • Повертає -1, якщо date_1 раніше
    • Повертає 0, якщо дати рівні
    • Повертає 1, якщо date_1 пізніше
  • Функції для окремих типів

    • DATE_CMP_TIMESTAMP
    • DATE_CMP_TIMESTAMPTZ
    • TIMESTAMP_CMP
    • TIMESTAMP_CMP_TIMESTAMPTZ
    • TIMESTAMPTZ_CMP
-- Порівняти 5 дат із таблиці на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
  SELECT date_col, 
         TRUNC(SYSDATE) AS current_date,
         DATE_CMP(date_col, SYSDATE)
    FROM combined_history_projections
ORDER BY date_col
   LIMIT 3;
 date_col  |  current_date | date_cmp
===========|===============|==========
2024-01-26 | 2024-01-27    |       -1
2024-01-27 | 2024-01-27    |        0
2024-01-28 | 2024-01-27    |        1
Вступ до Redshift

Обчислення різниці

  • DATEDIFF(datepart, value_1, value_2)
  • Підтримує date, time, timetz або timestamp в будь-якій позиції
    • Має містити datepart
  • Повертає
    • від'ємне значення, якщо value_2 раніше
    • Повертає 0, якщо дати рівні
    • додатне значення, якщо value_2 пізніше
Вступ до Redshift

Використання DATEDIFF

-- Днів до кінця першого кварталу на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT DATEDIFF(day,TRUNC(SYSDATE),'2024-03-31') AS days_diff;
days_diff
===========
64
Вступ до Redshift

Збільшення дат і часу

  • DATEADD(datepart, quantity, value)
  • Підтримує date, time, timetz або timestamp
  • Кількість може бути від'ємною для віднімання
-- Додати тиждень до дати на основі 
-- SYSDATE: 2024-01-27 20:05:55.976353
SELECT TRUNC(SYSDATE) AS todays_date,
       TRUNC(DATEADD(week, 1, SYSDATE)) AS next_weeks_date;
todays_date | next_weeks_date
============|==================
2024-01-27  | 2024-02-03
Вступ до Redshift

Збільшення дат і часу: підводні камені

  • Високосні роки при додаванні за місяцями дають кінець місяця
-- Додати рік місяцями до дати
SELECT DATEADD(month, 12, '2024-02-29');
2025-02-28 00:00:00
  • Високосні роки при додаванні за роками дають наступний день
-- Додати рік роками до дати
SELECT DATEADD(year, 1, '2024-02-29');
2025-03-01 00:00:00
Вступ до Redshift

Давайте потренуємось!

Вступ до Redshift

Preparing Video For Download...