我想我已经阅读了关于这个主题的每个主题,但没有一个解决我的问题。
首先,我正在使用的数据库将所有日期字段设置为varchar数据类型,这让我感到疯狂,因为每当我处理任何涉及的查询时,我都必须进行转换或转换日期。
我目前正在处理的查询应该提供一份医疗患者名单,这些患者都有一定的诊断,但必须在特定日期之前进行诊断。这就是我所拥有的。
<div class="article">
<p>This is a sentence.</p>
<p>This is a sentence.</p>
<p>This is a sentence.</p>
<p>This is a sentence.</p>
</div>
我收到错误消息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)
它告诉我错误在第1行("Conversion failed when converting date and/or time from character string."
行),所以这并不是真的有帮助而且我不确定我需要修理什么。
正如我所提到的,SELECT DISTINCT
字段具有varchar数据类型,我需要找到2014年12月底之前的任何日期。我已尝试通过以下方式解决此错误:尝试DateOfOnset
语句的不同组合 - 我甚至尝试在CAST
语句中的日期字段中加入一个强制转换,但我仍然遇到同样的错误。
我之前正在处理另一个问题,要求我在特定时间范围内找到所有患者预约,对于该查询,我设置了SELECT
子句:
WHERE
......它工作得非常好。由于我的当前查询设置方式几乎相同,我不确定为什么我会收到转换错误。
答案 0 :(得分:2)
您的日期格式错误:
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
强>
或使用样式101的CONVERT
:
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
答案 1 :(得分:1)
听起来SQL无法将存储的字符串转换为日期。这可以解释为什么CAST(pmh.DateOfOnset as Date)
在Cast(VisitDate as Date)
没有的地方失败 - 后者可能没有任何格式错误的日期。
最佳解决方案是将表列转换为正确的数据类型。第二种情况,添加包含正确数据类型的列,并转换数据;您必须修复任何现有的错误数据,以及在加载(yuck)时动态转换数据。另一个选项是添加计算列,但您在上述无效日期方面存在问题。 (你有什么版本的SQL?后来的版本有isdate
函数,这可能会有所帮助。)
如果不能修改表格,那么您可能会陷入编写必须假设某些数据无效(错误格式)的查询。