postgres Date/Time 学习笔记

1、Date/Time Types


参考文档:https://www.postgresql.org/docs/9.2/static/datatype-datetime.htmlhtml

Types 别名
timestamp [ (p) ] [ without time zone ]
timestamp [ (p) ] with time zone timestamptz
date
time [ (p) ] [ without time zone ]
time [ (p) ] with time zone
interval [ fields ] [ (p) ]

注:sequelize 里经常使用的 DATE 类型指的是 postgres 的 timestamptz 类型sql

2、Date/Time Input / Output


前提:postgres 的时区设置成了 PRC(中国)。数据库

一、普通值

例:2018-08-16 20:12:16+08函数

//存 
INSERT INTO "public"."MemberOrderLasts"("id","mobile","last_time")
VALUES
(1,'13600000000','2018-08-16 20:12:16+08');

//从库取
select  "last_time"  from "MemberOrderLasts"  where id = '1'
//2018-08-16 20:12:16.920642+08

//直接取 
select timestamp '1999-01-08 04:05:06.789+08'
//1999-01-08 04:05:06.789 
select date '1999-01-08 04:05:06.789+08'
//1999-01-08 
select time '1999-01-08 04:05:06.789+08'
//04:05:06.789

注:即便输入带时区的时间戳,postgres 底层存的也是转换后的 UTC 时间。经过 set timezone 能够改变了数据库展现时间的方式(带时区)post

二、特殊值

当在 SQL 命令中用做常量时,全部这些值都须要用单引号括起来。ui

Input String Valid Types Description
epoch date, timestamp 1970-01-01 00:00:00+00 (Unix system time zero)
infinity date, timestamp later than all other time stamps
-infinity date, timestamp earlier than all other time stamps
now date, time, timestamp current transaction's start time
today date, timestamp midnight today
tomorrow date, timestamp midnight tomorrow
yesterday date, timestamp midnight yesterday
allballs time 00:00:00.00 UTC
//存 
INSERT INTO "public"."MemberOrderLasts"("id","mobile","last_time")
VALUES
(2,'13600000000','now');

//从库取
select  "last_time"  from "MemberOrderLasts"  where id = '2'
//2018-09-13 14:15:12.920642+08

//直接取 
select timestamp 'now'
//2018-09-13 14:29:42.27933

3、Date/Time TimeZone


一、配置文件

postgresql.confpostgresql

timezone = 'PRC'code

二、postgres CLI

set timezone = 'xxx'htm

注意:推荐时区用 PRCAsia/Shanghai 而不是 +08:00进程

由于时区和时区惯例受政治决策的影响,而不单单是地球几何。世界各地的时区在 20 世纪初变得有些标准化,但仍然容易发生任意变化。

4、Date/Time Functions and Operators


参考文档:https://www.postgresql.org/docs/9.2/static/functions-datetime.html

一、运算符

+ / -* / / 不赘述,具体看文档)

select date '2018-01-12' + interval '7'
-- 2018-01-12 00:00:07 

select "activatedAt" - "createdAt" AS "diff" from "Members" where id = '373' 
-- 19 days 09:07:11.155

二、函数

Function Return Type Description Example Result
age( timestamp , timestamp ) interval Subtract arguments, producing a "symbolic" result that uses years and months age(timestamp '2001-04-10', timestamp '1957-06-13') 43 years 9 mons 27 days
age( timestamp ) interval Subtract from current_date (at midnight) age(timestamp '1957-06-13') 43 years 8 mons 3 days
date_part( text , timestamp ) double precision Get subfield (equivalent to extract); see Section 9.9.1 date_part('hour', timestamp '2001-02-16 20:38:40') 20
date_part( text , interval ) double precision Get subfield (equivalent to extract); see Section 9.9.1 date_part('month', interval '2 years 3 months') 3
date_trunc( text , timestamp ) timestamp Truncate to specified precision; see also Section 9.9.2 date_trunc('hour', timestamp '2001-02-16 20:38:40') 2001-02-16 20:00:00
extract(field from timestamp ) double precision Get subfield; see Section 9.9.1 extract(hour from timestamp '2001-02-16 20:38:40') 20
extract(field from interval ) double precision Get subfield; see Section 9.9.1 extract(month from interval '2 years 3 months') 3
isfinite( date ) boolean Test for finite date (not +/-infinity) isfinite(date '2001-02-16') true
isfinite( timestamp ) boolean Test for finite time stamp (not +/-infinity) isfinite(timestamp '2001-02-16 21:28:30') true
isfinite( interval ) boolean Test for finite interval isfinite(interval '4 hours') true
justify_days( interval ) interval Adjust interval so 30-day time periods are represented as months justify_days(interval '35 days') 1 mon 5 days
justify_hours( interval ) interval Adjust interval so 24-hour time periods are represented as days justify_hours(interval '27 hours') 1 day 03:00:00
justify_interval( interval ) interval Adjust interval using justify_days and justify_hours, with additional sign adjustments justify_interval(interval '1 mon -1 hour') 29 days 23:00:00

三、查询时间是否重叠

(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

// `(start1, end1) OVERLAPS (start2, end2)`
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: true

// `(start1, length1) OVERLAPS (start2, length2)`
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: false

// 遵循左开右闭的原则
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: true

5、Current Date/Time


一、普通专用

(1)带时区信息

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)

(2)不带时区信息

LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)

select CURRENT_TIMESTAMP
// 2018-09-13 15:10:05.639902+08
select LOCALTIMESTAMP  
// 2018-09-13 15:10:05.639902

还记得上面说的特殊值 now 吗,实际上跟 CURRENT_TIMESTAMP 同样:

//下面三个彻底相等
SELECT CURRENT_TIMESTAMP;
SELECT TIMESTAMP 'now';
SELECT now();

二、事务专用

为了保障同一事务中的多个修改具备相同的时间戳,因此 postgre 提供了针对性的时间函数:

(1) transaction_timestamp() 返回事务开始的时间

(2) statement_timestamp() 返回当前语句的开始时间

statement_timestamp() 和 transaction_timestamp() 只在一个事务的第一条命令里返回值相同

(3) clock_timestamp() 返回实际的当前时间,所以即便在单个 SQL 命令中它的值也会更改

6、Delaying Execution


pg_sleep()让当前的会话进程休眠 seconds 秒之后再执行。

SELECT pg_sleep(1.5);
相关文章
相关标签/搜索