Postgresql
添加/減去間隔的不同語法
到目前為止,我使用以下語法為時間戳添加間隔:
select now() + '5 year';
在我嘗試減去導致語法錯誤的間隔之前,這一直很好。
invalid input syntax for type timestamp with time zone: "5 year" LINE 1: select now() - '5 year'
在文件中,我了解到語法實際上是:
select now() - interval '5 year'
所以我的問題是:為什麼會
select now() + '5 year'
起作用?它是否只是偶然地工作並且它可能會在未來的 Postgresql 版本中中斷?
就像@a_horse 解釋的那樣,表達式有兩個可用的運算符
now() - '5 year'
:SELECT oprleft::regtype, oprname, oprright::regtype FROM pg_operator WHERE oprname = '-' AND oprleft = 'timestamptz'::regtype; oprleft | oprname | oprright --------------------------+---------+-------------------------- timestamp with time zone | - | timestamp with time zone timestamp with time zone | - | interval (2 rows)
選擇的確切原因可以在手冊中的Operator Type Resolution一章中找到:
$$ … $$
2.
檢查是否有完全接受輸入參數類型的運算符。如果存在一個(在所考慮的一組運算符中只能有一個完全匹配),請使用它。$$ … $$
a.
如果二元運算符呼叫的一個參數是未知類型,則假定它與此檢查的另一個參數的類型相同。$$ … $$ $$ … $$
大膽強調我的。閱讀整章以充分了解該過程。
如果一種參數類型未知且匹配運算符可用,則首選相同**類型。**有一個用於
timestamptz - timestamptz
賓果遊戲的運算符。運營商在這裡解決。幸運的是,“5年”是非法輸入timestamptz
,否則可能會導致混亂!
timestamptz - interval
運算符在添加顯式類型轉換後解析為:now() - interval '5 year' -- always the way to go