2010-10-29 50 views
1

爲什麼我會收到'2009'數據?我在做什麼WHERE子句錯了?SQL BETWEEN運營商

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
     CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
     DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate, 
    FROM mytable 
WHERE (CONVERT(varchar, EventDate, 101) BETWEEN '04/01/2010' AND '04/30/2010') 
+0

@OMG如何didja做的DAT? – Yves 2010-10-29 20:20:15

+1

選擇想要成爲代碼的文本,然後單擊文本編輯器上方的「代碼示例」按鈕(看起來像1和0)。 – FrustratedWithFormsDesigner 2010-10-29 20:21:32

回答

11

你正在做一個字符串比較,從左到右。 '04/10/2009'介於'04/0'和'04/3'之間。

如果您正在比較的字段是DATETIME,請不要嘗試將其轉換。 SQL Server可以將字符串轉換爲日期並正確地進行比較。

+0

謝謝馬克。所有答案都很好,但這是最好的帖子。 – Yves 2010-10-29 20:33:32

5

如果使用的是支持的日期格式,SQL Server將隱式的字符串轉換爲DATETIME:

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
     CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
     DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate, 
    FROM mytable 
WHERE EventDate BETWEEN '2010-04-01' AND '2010-04-30' 

您的查詢只是做字符串比較,這對日期跨度無關。

+0

你是我的英雄:0)。 10-q – Yves 2010-10-29 20:22:32

0

您的WHERE子句可能會進行字符串比較而不是日期比較。如果你想要做一個日期比較,您可以更改

CONVERT(varchar, EventDate, 101) 

CAST (CONVERT(varchar, EventDate, 101) AS DATETIME) 
0

你真的不需要所有的轉換。日曆中的日期將具有正確的開始和結束時間。您還需要考慮可能會經過結束日期或在日期之前開始並在日期範圍內結束的事件。終於還是開始前,現在已經超過...

下面是一些代碼,我們使用

(EventStartDtTm >= startDt and EventStartDtTm <= endDt) 
|| (EventStartDtTm <= startDt and EventEndDtTm >= startDt) 

- 帕特里克