Bil*_*lla 0 sql sql-server sql-server-2008
我正在运行此查询
select * from dbo.CHARGES m
LEFT JOIN Docs z ON z.DocId=m.DocId
AND CHARGE_DATE=CAST(z.DocDate + z.DocTime AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
并得到Conversion failed when converting date and/or time from character string,因为其中的某些行DocDate, DocTime具有空值
这DocTime是Varchar(5)
如何通过忽略NULL或错误值来运行此查询?
如果您的字符串采用格式,yyyy-MM-dd hh:mm那么您的转换表达式将类似于:
SELECT CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01') + ' ' + ISNULL(DocTime, '00:00'), 121)
Run Code Online (Sandbox Code Playgroud)
但是,在尝试转换日期之前检查一下它是否确实是一个日期可能是可取的:
SET DATEFORMAT YMD;
SELECT DocDate,
DocTime,
Formatted = CASE WHEN ISDATE(ISNULL(DocDate, '1900-01-01')
+ ' ' + ISNULL(DocTime, '00:00')) = 1
THEN CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01')
+ ' ' + ISNULL(DocTime, '00:00'), 121)
ELSE NULL
END
FROM (VALUES
('2013-10-01', '17:30'),-- CORRECT FORMAT
('2013-10-01', NULL), -- NULL TIME
('2013-13-10', '17:30'), -- INVALID DATE
('2013-01-05', 'XX:30'), -- INVALID TIME
(NULL, '17:00') -- NULL DATE
) t (DocDate, DocTime);
Run Code Online (Sandbox Code Playgroud)
请注意,即使在转换中设置ISDATE()了日期格式,我也已经设置了日期格式,这是出于的好处,如果未采用这种方式设置日期格式,则它可能会认为这2013-13-10是有效日期(2013年10月13日),但是转换时出错。
如果/当升级到SQL-Server 2012时,您可以简单地使用TRY_CONVERT:
SET DATEFORMAT YMD;
SELECT DocDate,
DocTime,
Formatted = TRY_CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01')
+ ' ' + ISNULL(DocTime, '00:00'), 121)
FROM (VALUES
('2013-10-01', '17:30'),-- CORRECT FORMAT
('2013-10-01', NULL), -- NULL TIME
('2013-13-10', '17:30'), -- INVALID DATE
('2013-01-05', 'XX:30'), -- INVALID TIME
(NULL, '17:00') -- NULL DATE
) t (DocDate, DocTime);
Run Code Online (Sandbox Code Playgroud)
我不容忍这种方法,并且(如我在评论中所述)强烈建议改正问题(将数据存储为错误的类型),而不是跳过圈来解决数据错误。
| 归档时间: |
|
| 查看次数: |
37005 次 |
| 最近记录: |