2012-07-09 40 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

相关问题