为何SELECT SYSDATE-1-DATE '2019-01-01'可行,另一条SQL却不行?
问题解答:为何两条SQL语句执行结果不同?
第一条语句能正常执行的原因
看这条语句:
SELECT SYSDATE - 1 - DATE '2019-01-01' FROM DUAL
在Oracle中,日期类型减数字是合法操作,作用是把日期往前推指定天数——这里SYSDATE - 1会得到当前日期前一天的日期。之后用这个新日期减去DATE '2019-01-01',属于日期减日期的操作,Oracle会自动计算两个日期之间的天数差,整个运算流程完全符合Oracle的类型规则,所以能正常执行。
第二条语句执行失败的原因
再看这条语句:
SELECT 1 - SYSDATE - DATE '2019-01-01' FROM DUAL
SQL运算默认遵循从左到右的顺序(无括号时),所以会先执行1 - SYSDATE。这里是数字减日期,Oracle没有定义这种操作的规则,它无法将日期类型直接转换为能和数字做减法的数值类型,因此会抛出类型不兼容的错误,导致语句无法运行。
总结来说:第一条语句的运算顺序是先做合法的日期减数字,再做合法的日期减日期;第二条先触发了非法的数字减日期操作,直接报错。
内容的提问来源于stack exchange,提问作者Alex Dannenberg Bovone
相关产品推荐
相关产品推荐

