为什么这个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 - SYSDATE
是NUMBER - DATE
,这不是一个有效的操作。
如果你想要语法正确,那么使用括号来改变优先级:
SELECT 1 - (SYSDATE - DATE '2019-01-01') FROM DUAL
则先求SYSDATE - DATE '2019-01-01'
,再求DATE - DATE = NUMBER
,然后求NUMBER - NUMBER
。