簡體   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