Postgresql

如果列未更新,則返回剩餘的小時、分鐘和秒

  • February 26, 2019

我目前有這個查詢:

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是 type timestamp,儘管你的演員UPDATE表是不確定的(矛盾的)。now() AT TIME ZONE 'UTC'產生 a , 如果是那種類型是timestamp有意義的。next_update但那又是為什麼next_update::timestamp?(為什麼將名為*“next_update”*的列更新為now()?似乎沒有意義。)

引用自:https://dba.stackexchange.com/questions/230706