HOWTO · PostgreSQL
如何从 PostgreSQL 时间戳中减去一天
本文介绍如何使用 INTERVAL 从 PostgreSQL 时间戳中减去一天;若只需要日期,可先转换为 DATE 再进行减法。
本页内容
要从 PostgreSQL 时间戳中减去一天并保留时分秒,可以减去一个 INTERVAL 值:SELECT TIMESTAMP '2021-01-01 08:08:01' - INTERVAL '1 DAY';。结果为 2020-12-31 08:08:01。如果只需要日期,可以先转换为 DATE,舍弃时间部分后再计算。这些是 PostgreSQL SQL 示例;运行需要 PostgreSQL 服务器,因此这里不将它们描述为经过实际运行验证的结果。
使用时间间隔从 PostgreSQL 时间戳中减去一天
如果结果仍需保留为时间戳,请使用 INTERVAL '1 DAY'。例如,SELECT TIMESTAMP '2021-01-01 08:08:01' - INTERVAL '1 DAY'; 会从给定时间戳中减去一天。此例中,日期变为前一个日历日,时间部分仍为 08:08:01。
时间间隔表示一段时间,PostgreSQL 可以将它加到日期或时间戳值上,也可以从这些值中减去。在此查询中,时间间隔为一天。计算以输入的时间戳为准,不依赖当前日期或时间。若要对存储的数据执行相同操作,可将时间戳字面值替换为时间戳列或参数;例如,created_at - INTERVAL '1 DAY' 会为每一行计算早一天的时间戳。
不要直接从时间戳中减去整数。例如,TIMESTAMP '2021-01-01 08:08:01' - 1 没有对应的“时间戳减整数”运算。若结果需要保留具体时刻,请使用时间间隔;若只需要日期,请先将时间戳转换为 DATE,再减去整数,如下一节所示。
从时间戳的日期部分中减去一天
转换为 DATE 会在减法前去掉时分秒。例如,SELECT TIMESTAMP '2021-01-01 08:08:01'::DATE - 1; 返回 2020-12-31。结果是日期而非时间戳,因此不会保留原来的 08:08:01。
当时间戳列记录事件发生的时刻,而计算结果需要用作日期标签或报表日期时,这种方法很有用。只有在确实要舍弃时间部分时才进行转换。如果后续代码还需要原来的时刻,请改为从时间戳中减去时间间隔。也可以对列进行转换和减法,例如 event_time::DATE - 1。
从 PostgreSQL 日期中减去一天
如果值已经是 PostgreSQL DATE,可以减去表示天数的整数:SELECT DATE '2021-01-01' - 1; 返回 2020-12-31。这里的整数表示天数,因此 - 7 会让日期提前七天。结果仍为 DATE。
根据值的类型和所需结果选择运算方式:使用 timestamp - INTERVAL '1 DAY' 保留时间戳数据;使用 timestamp::DATE - 1 从时间戳得到日期;如果已有日期,则使用 date - 1。PostgreSQL 的日期运算会按日历规则计算结果,无需自行计算每个月有多少天。示例使用固定字面值,以便清楚展示输入和结果。在表查询中,可将字面值替换为相应的列,并根据其类型选用时间间隔或整数运算。