2012-07-09 74 views
2

我需要檢查一個值是否爲日期,但ISDATE()函數由於偏移量而遇到像2012-07-21 00:00:00+02:00這樣的值時返回0。我的問題是我不能簡單地施放這個值,實際上ISDATE()是用來在查詢中檢查這個值是否是鑄造前的日期(參見下面的例子)。ISDATE()帶偏移量的日期時間字符串

SELECT p.propertyid 
FROM property p 
WHERE CASE Isdate(p.[value]) 
     WHEN 1 THEN 
      CASE 
      WHEN Cast(p.[value] AS DATETIME) >= Cast('7/1/2012' AS DATETIME) 
      THEN 1 
      ELSE 0 
      END 
     ELSE 0 
     END = 1 

所以我想知道如何檢查,如果本例中的p.[value]是一個日期。

+4

無論如何,您無法依賴此檢查進行投射工作,但無法保證檢查將首先發生。這裏有很多示例應該作爲依賴這種邏輯的警告:http://dba.stackexchange.com/questions/12941/does-sql-server-read-all-of-a-coalesce- function-even-if-the-first-argument-is-no – 2012-07-09 13:22:31

+0

爲什麼需要對名爲'enddate'的列進行ISDATE測試?是否有實際的非日期值?我不問他們爲什麼會在那裏(儘管我可能,也許應該),但我會很想知道他們的樣子。 – 2012-07-09 15:14:54

+0

對不起在示例中犯了一個錯誤,實際的列名稱是「值」,它並不總是包含日期,編輯示例來解決此問題。 – Rutger 2012-07-10 06:51:00

回答

-2

SQL Server 2012使這一切變得簡單。

select p.propertyid from Property p 
where try_convert(datetyime,p.[enddate]) is not null 
+4

-1,表示平均答案。 SQL Server '08被標記,向他顯示'12是沒有幫助的。 – 2012-07-09 14:38:22

+0

同意。謝謝 :) – Madhivanan 2012-07-10 06:04:08

相關問題