如何在时间戳类型中保持日期相同的同时仅更改时间

Gan*_*ukh 6 postgresql timestamp

我有用于安排日历事件的时间戳列。我只想更改时间部分,同时保持日期部分不变。

我怎么可能做到?我在 postgresql 上

当前的:

2017-07-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

到:

2017-07-01 17:00:00
Run Code Online (Sandbox Code Playgroud)

McN*_*ets 7

添加所需的间隔

select date + interval '5 hour'
Run Code Online (Sandbox Code Playgroud)

查看: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|
Run Code Online (Sandbox Code Playgroud)

dbfiddle在这里


Eva*_*oll 7

不影响日期的情况下,您无法在任一方向(向前或向后)相对地有意义地更改时间时间戳是日期和时间的混合体,意识到两者在任何现实世界实例中都是不可分割的。您无法通过增加时间以安全的方式从2017-07-01 00:00:002017-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)
Run Code Online (Sandbox Code Playgroud)

除了日期时间数学,想想$time=17, vs $datetime+=17. 其中之一更安全,更不可能造成翻车。您想将当前列增加17 小时,还是设置17:00:00当天?

  • `date_trunc('day', mydate) + Interval '17hr'` 提供了更多自由。 (2认同)