0

在此处使用 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

任何帮助,将不胜感激!

4

2 回答 2

0

您可以在选择中测试有效日期,如果日期无效则返回 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
于 2013-07-10T19:17:45.803 回答
0

您可以使用这样的东西来追查罪魁祸首,select * from MyTable where > ISDATE(convert(char(8),MyDateColumn))=0 yes

回答:有一些值在ship_date中只有1个零......

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

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

于 2013-07-10T19:16:37.380 回答