在此处使用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
任何帮助将不胜感激!
答案 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