SQL日期转换错误

时间:2013-07-10 16:56:55

标签: sql sql-server-2008

在此处使用SQL Server 2008。我仍然遇到将可怕日期从INT格式转换为可用内容的问题。当我只转换一列时,它工作正常,但如果我同时尝试所需的日期和发货日期,它会给我

  从字符串

转换日期和/或时间时,

转换失败

错误。

这是我的代码:

SELECT 
    SPSYS07.loc_code, SPSYS07.so_no, SPSYS07.cust_no,    
    CONVERT(DATETIME, CONVERT(CHAR(8), SPSYS07.req_d_date), 101),
    CONVERT(DATETIME, CONVERT(CHAR(8), SPSYS07.ship_date), 101)
FROM 
    SCOT_IQ.dbo.SPSYS07 SPSYS07
WHERE 
    (SPSYS07.loc_code = '103') AND (SPSYS07.order_date = 20120531)
ORDER BY 
    SPSYS07.so_no

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

  

您可以使用类似的内容来追踪罪魁祸首,从MyTable中选择*其中> ISDATE(convert(char(8),MyDateColumn))= 0 yes

     

ans:ship_date中有一些只有1的值...

这意味着您必须从查询中排除这些行,使用case表达式为错误值提供任意值,或者修复数据。此外,我很确定你会同意,但无论如何我都会说...你应该将日期值存储在日期/日期时间数据类型中。这可以防止这样的问题,并使事情变得更加容易。

此外,您应该存储值NULL或者具有一些任意默认值,而不是在日期列中存储值0。

答案 1 :(得分:0)

您可以在select中测试有效日期,如果日期无效,则返回NULL。最好的方法是将表中的日期存储为DATE类型。

SELECT 
    SPSYS07.loc_code, SPSYS07.so_no, SPSYS07.cust_no,    
    CASE WHEN ISDATE(CONVERT(CHAR(8), SPSYS07.req_d_date)) = 0 THEN NULL ELSE CONVERT(DATETIME, CONVERT(CHAR(8), SPSYS07.req_d_date), 101) END AS 'req_d_date',
    CASE WHEN ISDATE(CONVERT(CHAR(8), SPSYS07.ship_date)) = 0 THEN NULL ELSE CONVERT(DATETIME, CONVERT(CHAR(8), SPSYS07.ship_date), 101) END AS 'ship_date'
FROM 
    SCOT_IQ.dbo.SPSYS07 SPSYS07
WHERE 
    (SPSYS07.loc_code = '103') AND (SPSYS07.order_date = 20120531)
ORDER BY 
    SPSYS07.so_no