3

我試圖執行以下SQL查詢並根據日期過濾出數據。根據sql中的日期過濾數據

我需要顯示過濾掉的數據表,使得只有那些提到的起始日期間和行end_date之間

下面是我一直在努力

SELECT DISTINCT T1.column1, T1.column2, T2.START_DATE, T2.END_DATE 
FROM Table1 T1, Table2 T2 
WHERE (T1.column1= T2.column2) AND 
(T2.START_DATE >= '15/01/2013 10:58:58' AND 
    T2.END_DATE <= '18/01/2013 10:58:58') ORDER BY T2.START_DATE DESC 

我得到查詢2012年的結果也是如此。請幫我出

感謝

+0

嘗試使用的2013年1月15日10點58分58秒的ANSI格式,看看它是如何去 – PeterJ

+0

你在你的數據有錯誤,是否有END_DATEs是START_DATEs之前。如果您添加了where子句END_DATE> START_DATE是否解決了問題? –

+0

「START_DATE」和「END_DATE」列的數據類型是什麼? –

回答

5

既然你沒有任何錯誤提到的,如果START_DATEEND_DATEDATETIME數據類型,有什麼不對您的查詢。如果您沒有收到正確的記錄,請檢查數據。

但是您的date format may trouble you in a different server。您可以遵守一些良好的做法以避免此類問題。

-Whenever日期被用作字符串,嘗試使用它在ISO或ISO8601 格式(即'YYYYMMDD''YYYY-MM-DDTHH:MI:ss.mmm'

- 也應避免與連接表WHERE表1,表2這是舊的和 陳舊。 JOIN的表現要好得多,乾淨整潔。

您可以更改您的查詢,如下所示;

SELECT DISTINCT T1.column1, T1.column2, T2.START_DATE, T2.END_DATE 
FROM Table1 T1 JOIN Table2 T2 ON T1.column1 = T2.column2 
WHERE (T2.START_DATE >= '20130115 10:58:58' AND 
     T2.END_DATE <= '20130118 10:58:58') 
ORDER BY T2.START_DATE DESC 
+0

此問題主要是因爲數據類型,START_DATE和END_DATE的數據類型均爲VARCHAR。 現在我不能改變數據類型..... 我必須以某種方式處理字符串。我能做到這一點嗎? – shockwave

+0

您可以在START_DATE和END_DATE字段中顯示您存儲日期的格式嗎?如果格式正確,則可以在比較之前將它們轉換爲日期時間。防爆; WHERE(CONVERT(datetime,T2.start_date)> ='20130115 10:58:58'AND CONVERT(datetime,T2.end_date)<='20130118 10:58:58') – Kaf