繁体   English   中英

将varchar转换为日期

[英]Casting varchar as date

我想我已经阅读了有关该主题的几乎所有主题,但没有一个主题能够解决我的问题。

首先,我正在使用的数据库将所有日期字段都设置为varchar数据类型,这使我发疯,因为在处理涉及日期的任何查询时,我总是不得不进行强制转换或转换。

我目前正在使用的查询应该提取所有具有特定诊断的医疗患者列表,但是该诊断必须在特定日期之前给出。 这就是我所拥有的。

SELECT DISTINCT
    pd.PatientID,
    pd.PatientName,
    pmh.DateOfOnset
    pmh.DiagnosisCode
FROM PatientDemographic pd JOIN PatientMedicalHistory pmh ON pd.PatientID = pmh.PatientID
WHERE pmh.DiagnosisCode = '401.1'
    AND CAST(pmh.DateOfOnset as Date) > CAST('12/31/2014' as Date)

我收到一条错误消息: "Conversion failed when converting date and/or time from character string." 它告诉我错误是在第1行上( SELECT DISTINCT行),所以这并不是真的有帮助,我不确定我需要修复什么。

正如我提到的, DateOfOnset字段具有varchar数据类型,我需要查找2014年12月底之前出现的任何日期。我试图通过尝试CAST语句的不同组合来纠正此错误-我什至尝试在SELECT语句中的日期字段上添加SELECT ,但仍然出现相同的错误。

我之前正在处理另一个查询,该查询需要我在特定时间范围内查找所有患者约会,而对于该查询,我的WHERE子句设置为:

WHERE Cast(VisitDate as Date) BETWEEN CAST('01/01/2014' as Date) AND CAST('12/01/2014' as Date)

...而且效果很好。 由于我实际上以相同的方式设置了当前查询,因此我不确定为什么会遇到该转换错误。

您输入的日期格式有误:

SET DATEFORMAT dmy;
SELECT CAST('12/31/2014' as Date);
--Conversion failed when converting date and/or time from character string.

您可以在执行查询之前将其设置为mdy

SET DATEFORMAT mdy;
SELECT CAST('12/31/2014' as Date);

LiveDemo

或将CONVERT用作样式101:

SET DATEFORMAT dmy;
SELECT CONVERT(DATE,'12/31/2014',101)

如果您确实需要将DATE存储为VARCHAR ,请至少使用与文化无关的类型,例如ISO-8601

SET DATEFORMAT dmy;
SELECT CAST('20140201' as Date);
-- 01.02.2014

SET DATEFORMAT mdy;
SELECT CAST('20140201' as Date)
-- 01.02.2014

听起来SQL无法将存储的字符串转换为日期。 这可以解释为什么CAST(pmh.DateOfOnset as Date)Cast(VisitDate as Date)没有的情况下失败-后者可能没有任何格式错误的日期。

最好的解决方案是将表列转换为适当的数据类型。 第二好的情况是,添加包含正确数据类型的列,然后将数据转换过来; 您必须修复所有现有的不良数据,并在加载数据时即时转换数据(糟糕)。 另一个选择是,添加一个计算列,尽管您会遇到上述无效日期的问题。 (您拥有什么版本的SQL?更高版本的版本具有isdate函数,这可能会有所帮助。)

如果修改表不是一种选择,那么您可能会写一些必须假设某些数据无效(格式错误)的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM