我有一个表格,其中日期以文本形式存储,因为此字段也可以存储其他内容。
我需要提取该字段中包含日期的行,此日期必须在现在+ 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。 埃里克
答案 0 :(得分:4)
在使用WHERE
过滤之前,排除JOIN
子句中的非日期
ON t1.SubItemonderdeel=t2.Code and ISDATE(t1.SubItemWaarde) = 1)
您还应该考虑添加一组适合其数据类型的列。
答案 1 :(得分:1)
t2.subitemwaarde< t2.now_plus_2
将String
与Date
进行比较。在比较之前将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,这总是假的,因此行将被遗漏