日期和时间函数

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 节点的函数!

  • DATEDIFF 替代 AGE
  • GETDATE/SYSDATE 替代仅限 leader 的函数:
    • CURRENT_TIME
    • CURRENT_TIMESTAMP
    • ISFINITE
    • LOCALTIME
    • LOCALTIMESTAMP
    • NOW
Redshift 入门

截断日期和时间

  • TRUNC 从 timestamp 返回 date
-- 获取当前日期(基于 SYSDATE 为 2024-01-27 20:05:55.976353)
SELECT TRUNC(SYSDATE);

2024-01-27
  • DATE_TRUNC('datepart', timestamp) 截断到指定粒度,如小时或天

-- 截断到分钟(基于 SYSDATE 为 2024-01-27 20:05:55.976353) SELECT DATE_TRUNC('minute', SYSDATE);


----CODE_GLUE----
```{out}
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
  • 不止 monthdayyear
    • 例如:dayofweekquartertimezone
-- 获取当前星期几(基于 SYSDATE 为 2024-01-27 20:05:55.976353)
SELECT DATE_PART(dayofweek, SYSDATE);

6
Redshift 入门

比较日期和时间

  • DATE_CMP(date_1, date_2) 相对比较

    • 若 date_1 更早,返回 -1
    • 若相等,返回 0
    • 若 date_1 更晚,返回 1
  • 类型专用函数

    • DATE_CMP_TIMESTAMP
    • DATE_CMP_TIMESTAMPTZ
    • TIMESTAMP_CMP
    • TIMESTAMP_CMP_TIMESTAMPTZ
    • TIMESTAMPTZ_CMP
-- 基于 SYSDATE 为 2024-01-27 20:05:55.976353 比较表中的 5 个日期
  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
  • quantity 为负表示相减
-- 给日期加一周(基于 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 入门

¡Vamos a practicar!

Redshift 入门

Preparing Video For Download...