我在這里看到了類似的問題,例如“我想將時間從 13:00 更改為 17:00”并且答案總是“使用'13:00' INTERVAL '4 hours'”
但是,我需要的是將date_part值設定為現有日期,而不知道確切的間隔大小,與date_part( extract) 函式相反。
例如:
-- NOT A REAL FUNCTION
SELECT date_set('hour', date, 15)
FROM (VALUES ('2021-10-23 13:14:43'::timestamp), ('2020-11-02 10:00:34')) as dates (date)
結果將是:
2021-10-23 15:14:43
2020-11-02 15:00:34
如您所見,這不能通過簡單的 /- INTERVAL表達來完成。
可能的解決方案
我已經在 SO 上發現的是:
SELECT date_trunc('day', date) INTERVAL '15 hour'
FROM (VALUES ('2021-10-23 13:14:43'), ('2020-11-02 10:00:34')) as dates (date)
但是這個變體不會保留分鐘和秒。
雖然,我可以解決這個問題,只需添加回原始時間戳的分鐘、秒和微秒:
SELECT date_trunc('day', date) INTERVAL '15 hour'
(extract(minute from date) || ' minutes')::interval
(extract(microsecond from date) || ' microseconds')::interval
FROM (VALUES ('2021-10-23 13:14:43.001240'::timestamp), ('2020-11-02 10:00:34.000001')) as dates (date)
這將輸出:
2021-10-23 15:14:43.001240
2020-11-02 15:00:34.000001
它解決了這個問題。
但老實說,我對這個解決方案不是很滿意。也許有人知道更好的變體?
uj5u.com熱心網友回復:
下面函式背后的想法是清除單位(減去相應的間隔)并添加給定的間隔。
create or replace function timestamp_set(unit text, tstamp timestamp, num int)
returns timestamp language sql immutable as $$
select tstamp (num- date_part(unit, tstamp))* format('1 %s', unit)::interval
$$;
查看:
select
date,
timestamp_set('hour', date, 15) as hour_15,
timestamp_set('min', date, 33) as min_33,
timestamp_set('year', date, 2022) as year_2022
from (
values
('2021-10-23 13:14:43'::timestamp),
('2020-11-02 10:00:34')
) as dates (date)
date | hour_15 | min_33 | year_2022
--------------------- --------------------- --------------------- ---------------------
2021-10-23 13:14:43 | 2021-10-23 15:14:43 | 2021-10-23 13:33:43 | 2022-10-23 13:14:43
2020-11-02 10:00:34 | 2020-11-02 15:00:34 | 2020-11-02 10:33:34 | 2022-11-02 10:00:34
(2 rows)
在db<>fiddle 中嘗試一下。
uj5u.com熱心網友回復:
沒有設定時間戳特定部分的功能,但您可以使用日期/時間演算法來生成您想要的結果。例如:
select d (15 - extract(hour from d)) * interval '1 hour' from dates
結果:
?column?
------------------------
2021-10-23T15:14:43.000Z
2020-11-02T15:00:34.000Z
請參閱DB Fiddle 上的運行示例。
uj5u.com熱心網友回復:
SELECT to_timestamp(to_char(ts, 'YYYY-MM-DD 15:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') as fixed_time
FROM (VALUES ('2021-10-23 13:14:43'::timestamp), ('2020-11-02 10:00:34'::timestamp)) as dates (ts);
2021-10-23 15:14:43.000000 00:00
2020-11-02 15:00:34.000000 00:00
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/334437.html
標籤:sql PostgreSQL 约会时间
上一篇:嘗試插入具有1:N關系的物體時,重復鍵值違反了EntityFramework中的唯一約束“PK_Users”錯誤
