参考文档: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
前提: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
postgresql.conf
postgresql
timezone = 'PRC'code
set timezone = 'xxx'
htm
注意:推荐时区用 PRC
、Asia/Shanghai
而不是 +08:00
进程
由于时区和时区惯例受政治决策的影响,而不单单是地球几何。世界各地的时区在 20 世纪初变得有些标准化,但仍然容易发生任意变化。
参考文档: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
(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 命令中它的值也会更改
pg_sleep()
让当前的会话进程休眠 seconds 秒之后再执行。
SELECT pg_sleep(1.5);