St.*_*rio 5 sql postgresql date-arithmetic
我正在使用PostgreSQL 8.4.我有一个表的列,my_tbl其中包含日期(timestamp without timezone).例如:
date
-------------------
2014-05-27 12:03:20
2014-10-30 01:20:03
2013-10-19 16:34:34
2013-07-10 15:24:26
2013-06-24 18:15:06
2012-07-14 07:09:14
2012-05-13 04:46:18
2013-01-04 21:31:10
2013-03-26 10:17:02
Run Code Online (Sandbox Code Playgroud)
如何编写以下格式返回所有日期的SQL查询:
xxxx-xx-xx 23:59:59
Run Code Online (Sandbox Code Playgroud)
这个日期将设置为当天结束.
Gor*_*off 16
截取日期,截断日期,添加一天并减去一秒:
select date_trunc('day', date) + interval '1 day' - interval '1 second'
Run Code Online (Sandbox Code Playgroud)
update如果要更改表中的数据,可以将逻辑放入.
当然,您还可以添加24*60*60 - 1秒:
select date_trunc('day', date) + (24*60*60 - 1) * interval '1 second'
Run Code Online (Sandbox Code Playgroud)
但这似乎不太优雅.
Erw*_*ter 11
刚刚演员.更短,更快timestamp."date"在减去间隔之前添加(整数)ts:
ts::date + 1 - interval '1 sec' AS last_sec_of_day FROM my_tbl;
Run Code Online (Sandbox Code Playgroud)
或者只是添加间隔date_trunc().不需要两个操作, Postgres中的间隔输入可以一步完成:
ts::date + interval '1 day - 1 sec' AS last_sec_of_day
Run Code Online (Sandbox Code Playgroud)
或者,更简单,只需将所需的时间组件添加到日期:
ts::date + time '23:59:59' AS last_sec_of_day
Run Code Online (Sandbox Code Playgroud)
然而,是不是在一天结束.Postgres 1integer数据类型以微秒分辨率存储值.
一天的最新可能时间戳是1 second:
ts::date + interval '1 day - 1 microsecond' AS last_ts_of_day
Run Code Online (Sandbox Code Playgroud)
最后一个表达式除了正确之外应该是最快的.
通常,优越的方法是以第二天的日期作为独占的上边界操作,这更容易生成:
ts::date + time '23:59:59.999999' AS last_ts_of_day -- or interval, same result
Run Code Online (Sandbox Code Playgroud)
SQL小提琴第8.4页.同样适用于当前版本9.4.
旁白:我不会调用时间戳列'1 day - 1 sec',这是误导性的.它也是标准SQL中的保留字和Postgres中的基本类型名称,根本不应该用作标识符.
| 归档时间: |
|
| 查看次数: |
6693 次 |
| 最近记录: |