Postgresql
如果列未更新,則返回剩餘的小時、分鐘和秒
我目前有這個查詢:
UPDATE MyTable SET next_update = now() at time zone 'utc' WHERE next_update::timestamp < now() at time zone 'utc' - interval '1 day';
next_update
如果自上次設置以來已過去一天,則會更新該列next_update
。但是在無法更新值的情況下(一天還沒有過去)我怎樣才能返回更新的小時、分鐘和秒?
如果您想要一個查詢,我建議使用數據修改 CTE,例如:
WITH cte(bound) AS (SELECT now() AT TIME ZONE 'UTC' - interval '1 day') , upd AS ( UPDATE MyTable SET next_update = now() AT TIME ZONE 'UTC' FROM cte WHERE next_update < cte.bound -- why cast to timestamp? ) SELECT *, next_update - cte.bound AS time_to_update FROM MyTable, cte WHERE next_update >= cte.bound;
關鍵是看到相同的快照並且
UPDATE
不會返回新更新的行。(命名的第一個CTE只是為了方便,所以我們不必重複邊界的計算。)SELECT``SELECT``cte
time_to_update
是一個interval
形式23:53:27.141289
- hours:minutes:seconds:µs。如果可能有未來的時間戳,則為負 - 並且可能有前導天:'-26 days -23:58:35.25222'
. 否則在此查詢中它不能大於 24h。假設
next_update
是 typetimestamp
,儘管你的演員UPDATE
表是不確定的(矛盾的)。now() AT TIME ZONE 'UTC'
產生 a , 如果是那種類型是timestamp
有意義的。next_update
但那又是為什麼next_update::timestamp
?(為什麼將名為*“next_update”*的列更新為now()
?似乎沒有意義。)