将varchar转换为日期

时间:2016-04-21 20:41:58

标签: sql sql-server casting

我想我已经阅读了关于这个主题的每个主题,但没有一个解决我的问题。

首先,我正在使用的数据库将所有日期字段设置为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

......它工作得非常好。由于我的当前查询设置方式几乎相同,我不确定为什么我会收到转换错误。

2 个答案:

答案 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函数,这可能会有所帮助。)

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