postgres Date/Time 学习笔记

一、Date/Time Types


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

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

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

二、Date/Time Input / Output


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

1、普通值

例: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 可以改变了数据库展示时间的方式(带时区)

2、特殊值

当在 SQL 命令中用作常量时,所有这些值都需要用单引号括起来。

Input StringValid TypesDescription
epochdate, timestamp1970-01-01 00:00:00+00 (Unix system time zero)
infinitydate, timestamplater than all other time stamps
-infinitydate, timestampearlier than all other time stamps
nowdate, time, timestampcurrent transaction's start time
todaydate, timestampmidnight today
tomorrowdate, timestampmidnight tomorrow
yesterdaydate, timestampmidnight yesterday
allballstime00: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 

三、Date/Time TimeZone


1、配置文件

postgresql.conf

timezone = 'PRC'

2、postgres CLI

set timezone = 'xxx'

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

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

四、Date/Time Functions and Operators


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

1、运算符

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

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

2、函数

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

3、查询时间是否重叠

(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

五、Current Date/Time


1、普通专用

(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();

2、事务专用

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

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

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

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

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

六、Delaying Execution


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

SELECT pg_sleep(1.5);

转载于:https://www.cnblogs.com/xjnotxj/p/9640929.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值