Postgresql

添加/減去間隔的不同語法

  • January 23, 2019

到目前為止,我使用以下語法為時間戳添加間隔:

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

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