Ganbayar Gansukh Asked: 2017-03-14 07:18:54 +0800 CST2017-03-14 07:18:54 +0800 CST 2017-03-14 07:18:54 +0800 CST 如何在时间戳类型中保持日期相同的同时仅更改时间 772 我有用于安排日历事件的时间戳列。我想只更改时间部分,同时保持日期部分不变。 我怎么可能做到?我在 postgresql 当前的: 2017-07-01 00:00:00 至: 2017-07-01 17:00:00 postgresql timestamp 3 个回答 Voted Best Answer Evan Carroll 2017-03-14T08:39:23+08:002017-03-14T08:39:23+08:00 您无法在不影响日期的情况下相对于任一方向(向前或向后)有意义地更改时间。时间戳是日期和时间的混合体,意识到两者在任何现实世界的实例中都是不可分割的。您不能通过增加时间以安全的方式从2017-07-01 00:00:00到2017-07-01 17:00:00。如果你尝试它,你就是在假设日期是什么。但是,您可以设置时间戳的时间部分,完全删除日期部分date_trunc。在这种方法中,您可以确保将时间部分设置为(或至少更加确定)。只要您在设置时没有特别强制显式翻转(例如添加 25 小时),就应该很好。我在这里看到两个问题: 无论翻转如何,我如何相对增加时间戳? 如何设置时间戳的时间部分? 这是一些显示两种方法的代码 SELECT mydate + '7 hours' AS "+7 hours", mydate + '17 hours' AS "+17 hours", date_trunc('day', mydate) + '17:00:00' AS "setting to 17 hours", date_trunc('day', mydate) + '25:00:00' AS "setting to 25 hours" FROM (VALUES ('2017-07-02 10:00:00'::timestamp)) AS t(mydate); +7 hours | +17 hours | setting to 17 hours | setting to 25 hours ---------------------+---------------------+---------------------+--------------------- 2017-07-02 17:00:00 | 2017-07-03 03:00:00 | 2017-07-02 17:00:00 | 2017-07-03 01:00:00 (1 row) 除了日期时间数学,想想$time=17, vs $datetime+=17。其中之一要安全得多,而且不太可能造成翻车。您想将当前列增加17 小时,还是将其设置为17:00:00当天? McNets 2017-03-14T07:25:38+08:002017-03-14T07:25:38+08:00 添加所需的 INTERVAL select date + interval '5 hour' 看一下:Postgres 文档上的日期/时间函数和运算符。 select a.MyDate + interval '5 hour' as Result_Date from (select '2017-07-01 00:00:00'::date myDate) a |result_date | |:------------------| |2017-07-01 05:00:00| dbfiddle在这里 CitizenFish 2021-09-18T00:59:51+08:002021-09-18T00:59:51+08:00 另一种方法是先转换为日期,然后再转换为时间戳 SELECT date::DATE::TIMESTAMP + interval '5 hour' 这可确保保留日期
您无法在不影响日期的情况下相对于任一方向(向前或向后)有意义地更改时间。时间戳是日期和时间的混合体,意识到两者在任何现实世界的实例中都是不可分割的。您不能通过增加时间以安全的方式从
2017-07-01 00:00:00
到2017-07-01 17:00:00
。如果你尝试它,你就是在假设日期是什么。但是,您可以设置时间戳的时间部分,完全删除日期部分date_trunc
。在这种方法中,您可以确保将时间部分设置为(或至少更加确定)。只要您在设置时没有特别强制显式翻转(例如添加 25 小时),就应该很好。我在这里看到两个问题:这是一些显示两种方法的代码
除了日期时间数学,想想
$time=17
, vs$datetime+=17
。其中之一要安全得多,而且不太可能造成翻车。您想将当前列增加17 小时,还是将其设置为17:00:00
当天?添加所需的 INTERVAL
看一下:Postgres 文档上的日期/时间函数和运算符。
dbfiddle在这里
另一种方法是先转换为日期,然后再转换为时间戳
这可确保保留日期