簡體   English   中英

SQL Server:是否不遵循操作順序?

[英]SQL Server : order of operations not being followed?

[運行SQL Server 2008 SP3]

我有一個查詢,導致smalldatetime類型的溢出。 但是,由於我構造查詢的方式,從理論上講永遠不會發生-邏輯應該在執行DATEADD()之前很早就知道真值,這會導致溢出。

這是WHERE子句的相關部分:

TimeIn >= '1/8/1950' AND TimeIn < '1/9/1950' AND
DATEADD(week, DATEDIFF(week, '1/8/1950', '9/14/2014'), TimeIn) >= '9/14/2014'

這很好用-除非TimeIn( smalldatetime )> = 10/1/2014,否則它將溢出smalldatetime空間。 但是,為什么DATEADD()甚至被執行? 如果日期是14年10月1日,它應該永遠不會被執行...但它是。

WHERE條件的部分未按定義的順序執行,從而阻止了DATEADD()的執行,而這並不是SQL Server的工作方式。

使用有問題的日期硬編碼運行查詢時,我實際上看不到任何錯誤,但是解決此問題的一種方法是使用CASE表達式:

TimeIn >= '1/8/1950' AND TimeIn < '1/9/1950' 
AND CASE WHEN TimeIn >= '1950-01-08' AND TimeIn < '1950-01-09' 
         THEN DATEADD(week, DATEDIFF(week, '1/8/1950', '9/14/2014'), TimeIn) 
    END >= '2014-09-14'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM