背景:最近頻繁使用到時間轉換相關的操作,特此小記。

1、實時取最近24小時內資料。

select now() - interval '24h';

通過sql獲得符合要求的時間段,當做where條件即可。如:

select * from table1 where createTime between now() - interval '24h' and now()

'24h' 等同於 '24 hour',更多引數見文件。

2、時間差轉換為時、分、秒。

關鍵函式:EXTRACT(field FROM source)、date_part('field', source)

SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00') 秒;
--結果:3600
SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60 分鐘;
--結果:60
SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60/60 小時;
--結果:1
SELECT date_part('epoch', TIMESTAMP '2022-08-17 20:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60/60/24 天;
--結果:365,如果不需要精確到小數有更簡單的:
SELECT date '2022-08-17' - date '2021-08-17' 天;
--結果:365

月和年的天數不確定,不能用以上方法,需要分別計算相加,如:

SELECT date_part('year', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00'))*12 + date_part('month', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00')) 月;
--結果:18
SELECT date_part('year', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00')) + date_part('month', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00'))/12 年;
--結果:1.5

以上示例均可使用extract函式,如:

SELECT extract(EPOCH FROM TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00') 秒;
--結果:3600,此處不再一一舉例

3、注意

3.1 field域值

field可以是day、month、minute、year,也可以是:dow(一週中的日,從週日(0)到週六(6))、doy(一年的第幾天(1–365/366)),等等、、、但是前者獲取的只是域值。如:

SELECT date_part('hour', TIMESTAMP '2021-08-17 20:00:00');
--結果:20
SELECT date_part('hour', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00');
SELECT date_part('hour', TIMESTAMP '2021-08-18 21:00:00' - TIMESTAMP '2021-08-17 20:00:00');
--結果: 1
結果相同都是1,並不會做跨天的處理。
3.2 epoch

對於timestamp with time zone值, 是自 1970-01-01 00:00:00 UTC 以來的秒數(結果可能是負數); 對於date and timestamp值,是自本地時間 1970-01-01 00:00:00 以來的描述;對於interval值,它是時間間隔的總秒數 (簡單理解就是秒數差值......)

4、附上鍊接

時間/日期函式和操作(官網)

時間/日期函式和操作(中文)