2016-04-21 58 views
1

我想我已經閱讀了關於這個主題的每一個線索,他們都沒有解決我的問題。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聲明中的日期字段中包含一個強制轉換,並且我仍然收到相同的錯誤。

我是工作在早些時候的另一項查詢,需要我從某一個時間框架內找到所有病人預約,併爲查詢,我有我的WHERE條款設置,如:

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

...它工作得很好。由於我使用幾乎相同的方式設置了當前的查詢,所以我不確定爲什麼我會收到該轉換錯誤。

+0

可能您在pmh.DateOfOnset中有無效日期 – FLICKER

+2

錯誤發生在第1行,因爲第1行是包含錯誤的語句的開頭。運行select語句時發生錯誤。 – GendoIkari

+0

可能是一種文化的東西。 12/31可能會被解釋爲31/12 –

回答

1

你有錯誤的日期格式:

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) 

如果你真的需要存儲DATEVARCHAR使用至少培養技術型樣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

聽起來像SQL無法將存儲的字符串轉換爲日期。這可以解釋爲什麼CAST(pmh.DateOfOnset as Date)失敗,其中Cast(VisitDate as Date)不是 - 後者可能沒有任何錯誤格式的日期。

最好的解決方案是將您的表列轉換爲適當的數據類型。第二種情況是,添加包含適當數據類型的列,然後轉換數據;您必須修復任何現有的不良數據,並在數據加載時進行轉換(yuck)。另一種選擇是添加一個計算列,儘管你會遇到上述無效日期的問題。 (你有什麼版本的SQL?後續版本具有isdate函數,這可能對此有所幫助。)

如果修改表不是可選項,那麼您可能會寫入必須假定某些數據無效(錯誤格式)的查詢。

+0

是的,我可能堅持後一種選擇。數據庫連接到一個醫療記錄系統,並且所有日期都以字符串的形式輸入,因爲它們來自系統中的自由文本字段(不知道天才是如何設置它的,但它已經爲大量的壞的數據在許多不同的表中)。我可能只搜索所有的診斷,並將結果粘貼到Excel中,並從2014年和更早的版本中篩選。不是超級有效,但也不是浪費時間來對抗錯誤,我不能修復... – EJF

+0

更新:是的,再次看到它後,它看起來像是有相當多的日期,只是空白。這可能是什麼讓我煩惱。 – EJF

+1

如果日期爲空白,您可以忽略它們,還是使用默認日期值? (今天,1980年1月1日,或其他一些) –