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 zone | timestamptz | 日期+时间 |
| date | 日期 | |
| time [ (p) ] [ without time zone ] | 时间 | |
| time [ (p) ] with time zone | timetz | 时间 |
| interval [ fields ] [ (p) ] | 时间段 |
注:
1、sequelize 里常用的 DATE 类型指的是 postgres 的
timestamptz类型2、仅 Date 没有时区概念。
3、
interval这里不展开了,待写。
二、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
注:对于国内程序员来说,使用“/”容易产生歧义,最好使用“-”做分隔,即
2018-08-16 20:12:16。
2、特殊值
当在 SQL 命令中用作常量时,所有这些值都需要用单引号括起来。
| 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');
三、Date/Time TimeZone
参考我另一篇:《从 moment -> nodejs -> sequelize -> postgres,你都得设置好时区》。
四、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、函数
| 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 |
常用:extract / date_part 和 date_trunc 函数
1、extract / date_part
select date_part('hour', timestamp '2001-02-16 20:38:40')
-- 20
select extract('hour' from timestamp '2001-02-16 20:38:40')
-- 20
2、date_trunc
select date_trunc('hour', timestamp '2001-02-16 20:38:40')
-- 2001-02-16 20:00:00
3、查询时间是否重叠
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
// 一、两种用法
// 1、`(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
// 2、`(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、普通
注意:下面的日期/时间在同一个事务里都是不变的。(如果要变化,建议使用下面即将介绍的 statement_timestamp 或者 clock_timestamp )。
(1)带时区信息
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
还记得上面说的特殊值 now 吗,实际上跟 CURRENT_TIMESTAMP 一样:
//下面三个完全相等
SELECT CURRENT_TIMESTAMP;
SELECT TIMESTAMP 'now';
SELECT now();
(2)不带时区信息
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)
仅 Date 没有时区概念。
select CURRENT_TIMESTAMP
// 2018-09-13 15:10:05.639902+08
select LOCALTIMESTAMP
// 2018-09-13 15:10:05.639902
2、事务专用
为了保障同一事务中的多个修改具有相同的时间戳,所以 postgre 提供了针对性的时间函数:
(1) transaction_timestamp() 返回事务开始的时间
其实 transaction_timestamp = CURRENT_TIMESTAMP ,只是针对的场景不同,所以换了个名字。
(2) statement_timestamp() 返回当前语句的开始时间
statement_timestamp() 和 transaction_timestamp() 只在一个事务内的第一条命令返回值相同。
(3) clock_timestamp() 返回实际的当前时间,因此即使在单个 SQL 命令中它的值也会更改。
select clock_timestamp(),clock_timestamp()
-- 2020-03-05 16:59:04.264526+08 | 2020-03-05 16:59:04.264527+08 (不一样)
六、Delaying Execution
pg_sleep()让当前的会话进程休眠 seconds 秒以后再执行。
SELECT pg_sleep(1.5);
postgres Date/Time 学习笔记的更多相关文章
- javascript Date类型 学习笔记
1 创建一个新的日期对象,如果不带参数,则对象自动获得当前的日期和时间 var d = new Date() 2 如果需要指定特定的日期,则可以通过Date.parse() 或者 Date().UTC ...
- Linux Date命令学习笔记
date 根据给定格式显示日期或设置系统日期时间.print or set the system date and time 指令所在路径:/bin/date 命令参数: 参数 描述 -d 显示字符串 ...
- [原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Android学习笔记1 android adb启动失败问题 adb server is out of date. killing...
下面是Android的学习笔记,原文地址. 我是使用adb devices出现如下红字错误, 使用第一种方法方法,结果关掉豌豆荚就可以了. android adb启动失败问题 adb server i ...
- JavaScript学习笔记(十五)——对象之Date,RegExp
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- WeX5学习笔记
目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
随机推荐
- alert()、confirm()、prompt()的区别
使用消息框 使用警告.提示和确认 可以使用警告.确认和提示消息框来获得用户的输入.这些消息框是 window 对象的接口方法.由于 window 对象位于对象层次的顶层,因此实际应用中不必使用这些消息 ...
- 28.Hibernate-HQL查询.md
目录 1.概述 2.HQL实例 3.Criteria 查询 4.SQL本地查询 5.分页 1.概述 1)Get/load主键查询 2)对象导航查询 3)HQL查询, Hibernate Query l ...
- week0713.5 newspaper 安装问题
然后爆红说nltk==2.0.5 太老了 所以我们 把包下载下来将requirements文件中nltk==2.0.5改成3.3.0 然后 将包打包 然后安装这个包就OK 下载newpaper wge ...
- vs2015单步调试问题(附加进程)
如果页面有Codebehind的页属,那么前端通过ajax提交到后端代码,无法在后端代码中取到值. 这是一个vs属性标记,用于跟踪管理项目.如果后端代码的自定义指定(Inherits)的话,应该取掉 ...
- C#//字节数组转16进制字符串
//字节数组转16进制字符串 private static string byteToHexStr(byte[] bytes,int length) { string returnStr = &quo ...
- 深入JVM之类的加载器
类加载器有两种: —java虚拟机的自带加载器 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(AppClassLoder) —自定义的类加载器 java.lang ...
- HDU-1078.FatMouseandCheese(线性dp + dfs)
本题大意:在一个n * n的迷宫内进行移动,左上角为初始位置,每次可以走的步数不能超过m,并且每次走的方格上面的数字要大于前一次走的放个数字,不能走到格子外面,问如何能使得到的数字和最大. 本题思路: ...
- scrapy -->CrawlSpider 介绍
scrapy -->CrawlSpider 介绍 1.首先,通过crawl 模板新建爬虫: scrapy genspider -t crawl lagou www.lagou.com 创建出来的 ...
- 419. Battleships in a Board 棋盘上的战舰数量
[抄题]: Given an 2D board, count how many battleships are in it. The battleships are represented with ...
- centos 7 一些命令
su 切换到管理员账户cd 'wo shi mu lu'ls 查看 当前目录或者文件tar -xvzf pip-10.0.1.tar.gz 解压 文件systemctl restart network ...