两个日期比较表示从字符串转换日期和/或时间时转换失败

时间:2013-12-20 12:17:44

标签: sql sql-server-2008

我有一个表格,其中日期以文本形式存储,因为此字段也可以存储其他内容。

我需要提取该字段中包含日期的行,此日期必须在现在+ 2个月内。

我的查询是:

;WITH sel AS (SELECT t1.ItemUserID, t3.Omschrijving AS Hoofditem, 
              t4.Omschrijving AS Subitem, t2.Omschrijving AS SubItemonderdeel,
              CONVERT(DATE,t1.subitemwaarde) AS subitemwaarde,
              CONVERT(DATE,DATEADD(month, 2, CONVERT(DATE,GETDATE(),101))) as now_plus_2
             FROM MainDataTable AS t1
             LEFT JOIN SubItemsOnderdelen AS t2 ON t1.SubItemonderdeel=t2.Code 
             LEFT JOIN HoofdItemOnderdelen AS t3 ON t1.Hoofditem = t3.Code
             LEFT JOIN ItemData AS t4 ON t1.subitem=t4.itemcode 
             WHERE t2.Omschrijving LIKE 'expires on' 
               and ISDATE(t1.SubItemWaarde) = 1)

SELECT * FROM sel AS t2

如果我运行这个,我得到一个包含所有数据的表,最后两列显示日期并且是日期列。

当我添加     在哪里t2.subitemwaarde< t2.now_plus_2 到最后一个SELECT语句,我得到错误:

“从字符串转换日期和/或时间时转换失败”

为什么呢?我做错了什么?

RG。 埃里克

4 个答案:

答案 0 :(得分:4)

在使用WHERE

过滤之前,排除JOIN子句中的非日期
ON t1.SubItemonderdeel=t2.Code and ISDATE(t1.SubItemWaarde) = 1)

您还应该考虑添加一组适合其数据类型的列。

答案 1 :(得分:1)

t2.subitemwaarde< t2.now_plus_2StringDate进行比较。在比较之前将t2.subitemwaarde转换为日期以解决问题:

CONVERT(DATE,t2.subitemwaarde) < t2.now_plus_2

如果t2.subitemwaarde不是日期,则会导致错误,因此您可能需要添加过滤器 ISDATE(t2.subitemwaarde) = 1

答案 2 :(得分:1)

试试这个,

我认为你必须使用以下格式。因为我不知道您要转换的日期格式。

select CONVERT(Datetime,'20/12/2012 12:12:00.000',103)

答案 3 :(得分:1)

我不完全理解您将哪个字段作为日期进行比较,但尝试这样的事情:

WHERE CASE WHEN ISDATE(t2.SubItemWaarde) = 1) 
  THEN CONVERT(DATE, t2.subitemwaarde) < t2.now_plus_2
  ELSE 1=0
  END

基本上是一个case语句,用于检查字段是否为日期,然后是条件,否则1 = 0,这总是假的,因此行将被遗漏