Dates Datatype Operation



为什么这个SQL语句工作:

SELECT SYSDATE - 1 - DATE '2019-01-01' FROM DUAL

这个不行吗?

SELECT 1 - SYSDATE - DATE '2019-01-01' FROM DUAL

我知道你不能用日期操作一个数字,但正因为如此,我不明白为什么第一个查询工作。

SYSDATE - 1表示前一天。Oracle看到尝试在日期上减去(或添加)一个数字,并自动将该数字解释为一个完整的24小时天。这就是为什么它可以工作。

1 - SYSDATE在Oracle中是没有意义的。它的意思应该是"现在,在某一天之前"这毫无道理。您可以将数字(天)与日期相减/相加,但不能将数字相减日期。
SELECT SYSDATE - 1 - DATE '2019-01-01' FROM DUAL

可以工作,因为操作符按优先级顺序求值,然后,对于相同优先级的操作符,从左到右,因此查询是,用括号表示求值顺序:

SELECT ((SYSDATE - 1) - DATE '2019-01-01') FROM DUAL

内括号为DATE - NUMBER型,输出DATE型,外括号代入DATE - DATE型,输出NUMBER型;


SELECT 1 - SYSDATE - DATE '2019-01-01' FROM DUAL

可以用括号表示运算符的求值顺序,重写为:

SELECT ((1 - SYSDATE) - DATE '2019-01-01') FROM DUAL

失败,因为1 - SYSDATENUMBER - DATE,这不是一个有效的操作。

如果你想要语法正确,那么使用括号来改变优先级:

SELECT 1 - (SYSDATE - DATE '2019-01-01') FROM DUAL

则先求SYSDATE - DATE '2019-01-01',再求DATE - DATE = NUMBER,然后求NUMBER - NUMBER

相关内容

  • 没有找到相关文章

最新更新