如何结束一天?

时间:2014-12-29 12:58:39

标签: 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

如何编写以格式返回所有日期的SQL查询:

xxxx-xx-xx 23:59:59

每个日期都将设置为当天结束。

2 个答案:

答案 0 :(得分:15)

取日期,截断日期,添加一天并减去一秒:

select date_trunc('day', date) + interval '1 day' - interval '1 second'

如果要更改表格中的数据,可以将逻辑放在update中。

当然,您还可以添加24 * 60 * 60 - 1秒:

select date_trunc('day', date) + (24*60*60 - 1) * interval '1 second'

但这似乎不太优雅。

答案 1 :(得分:6)

刚刚施展到目前为止。比date_trunc()更短,更快。在减去区间1之前添加1 second(整数):

SELECT date::date + 1 - interval '1 sec' AS last_sec_of_day FROM my_tbl;

或者只是添加间隔'1 day - 1 sec'。不需要两个操作,Postgres中的interval input可以一步完成:

date::date + interval '1 day - 1 sec' AS last_sec_of_day

或者,更简单,只需将所需的时间组件添加到日期:

date::date + '23:59:59'::time AS last_sec_of_day

然而, xxxx-xx-xx 23:59:59 在一天结束时。 Postgres timestamp data type以微秒分辨率存储值 一天的最新可能时间戳为xxxx-xx-xx 23:59:59.999999

date::date + interval '1 day - 1 microsecond' AS last_ts_of_day
date::date + '23:59:59.999999'::time AS last_sec_of_day

除了正确之外,最后一个表达式应该最快 通常,优越的方法是使用第二天的日期作为独占上边界进行操作,这更容易生成:

date::date + 1 AS next_day
对于第8.4页,

SQL Fiddle。同样适用于当前版本9.4。

除此之外:我不会调用时间戳列"date",这会产生误导。它也是标准SQL中的保留字和Postgres中的基本类型名称,不应该用作标识符。