web-dev-qa-db-ja.com

タイムスタンプ型で日付を同じにして時間のみを変更する方法

カレンダーイベントのスケジュールに使用するタイムスタンプ列があります。日付部分はそのままにして、時間部分のみ変更したい。

どうすればできますか?私はpostgresqlにいます

電流:

2017-07-01 00:00:00

に:

2017-07-01 17:00:00
6
Nomadme

日付に影響を与えることなく、どちらかの方向(前方または後方)で相対的に時間を有意義に変更することはできません。タイムスタンプは日付と日付の両方のハイブリッドです現実世界のインスタンスでは2つが不可分の関係にあることに気付く時間です。時間を増やすことで、安全な方法で2017-07-01 00:00:00から2017-07-01 17:00:00に移動することはできません。試してみると、日付が何であるかを推測していることになります。ただし、タイムスタンプの時刻部分をsetして、日付部分を date_trunc で完全に削除できます。この方法では、時間部分がどのように設定されているかを確認します(または少なくともはるかに確実に)。明示的なロールオーバー(25時間の追加など)を強制的に設定しない限り、問題はありません。ここに2つの質問があります。

  • ロールオーバーに関係なく、タイムスタンプを相対的に増分するにはどうすればよいですか?
  • タイムスタンプの時間部分を設定するにはどうすればよいですか?

これは両方のアプローチを示すコードです

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$datetime+=17を比較してください。それらの1つははるかに安全で、ロールオーバーを作成する可能性が低くなります。現在の列をインクリメントして、17時間まで何であれ、setして17:00:00にしますか?その日に?

5
Evan Carroll

希望の間隔を追加します

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 ここ

7
McNets