1

我搜索了大约 20 个与错误消息“从字符串转换日期和/或时间时转换失败”有关的结果。似乎没有人能解决我的问题。

一点历史,上周五查询工作正常,返回的数据是正确的。在接下来的星期一,查询不再起作用并给出此错误消息,“从字符串转换日期和/或时间时转换失败。” 因此,经过几个小时的战斗,它能够运行一个包含有问题代码的函数,并且查询再次完美运行。直到今天早上。我进入办公室并运行查询并收到错误“从字符串转换日期和/或时间时转换失败”。所以现在我要把头发拉出来。

我首先使用 isDate 函数验证返回的每条记录实际上是有效日期。所有日期都是字符串格式的有效日期。我只是在检查记录是否超过 1 年。

我确实有几个 INNER JOINS 并且一直想知道它们是否会影响输出。

SELECT 
gc2p.partnumber, gc2p.orderby, gc2p.campaigncode, gp2a.assetfilename
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
,[StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa
,[StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
,[StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a 
WHERE gc2p.partnumber=gpwa.PARTNUMBER and
gc2p.id=gc2a.id and
gp2a.PRODUCTNAME=gpwa.PARTNUMBER and
ATTRIBUTENAME='New Date' AND 
ATTRIBUTEVALUE > dateadd(month,-12,getdate()) AND 
gc2p.id = '5665976' and 
gc2a.assettype='Primary Image' AND 
gp2a.ASSETTYPE = 'Primary Image'
order by gc2p.orderby

如果有人能帮我一把,那就太好了。

编辑:当我删除 'ATTRIBUTEVALUE > dateadd(month,-12,getdate())' 时,查询运行良好。我忘了提及引发错误的查询的确切部分。

编辑:更新的查询 -现在为那些寻求类似答案的人提供查询。

SELECT TOP 18 gc2p.partnumber, gpwa.ATTRIBUTECNAME,gp2a.ASSETFILENAME, gpwa.ATTRIBUTEVALUE
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa ON gc2p.partnumber=gpwa.PARTNUMBER and gpwa.ORDERBY='96'
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a ON gc2p.id=gc2a.id
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a ON gc2p.partnumber=gp2a.PRODUCTNAME
WHERE gc2p.id = 5665976 AND gp2a.assettype='Primary Image' AND gc2a.assettype='Primary Image' 
AND(CASE WHEN ISDATE(ATTRIBUTEVALUE)  = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate())
order by gc2p.orderby
4

2 回答 2

2

问题很可能是您在 ATTRIBUTEVALUE 字段中有非日期数据。您假设包含ATTRIBUTENAME='New Date'将过滤它,但它可能不取决于查询计划。尝试...

(CASE WHEN ISDATE(ATTRIBUTEVALUE) = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate()) AND ...

在复杂的连接中,SQL 引擎可能决定先连接表然后使用过滤器,这将导致不匹配不是每个实例ATTRIBUTEVALUE都会隐式转换为日期。

另外,请使用真正的 SQL 连接,而不是逗号连接。这是一种糟糕的形式,导致的问题比它解决的问题多得多。

于 2012-11-07T20:32:30.857 回答
0

不管是什么,请确保您的查询与此无关。一切都与表中的数据有关。此外,正如我看到的查询一样,您似乎正在加入一些视图,并且在视图定义中可能有一些导致此错误的转换。如果我在哪里,我会对表进行一些简单的查询,并将字符串列一一转换为日期时间,直到找到错误参考。

希望能帮助到你。

干杯

于 2012-11-07T20:31:32.900 回答