2012-05-17 2149 views
199

我想:如何在SQL Server中查詢大於特定日期的所有日期?

SELECT * 
FROM dbo.March2010 A 
WHERE A.Date >= 2010-04-01; 

A.Date樣子:2010-03-04 00:00:00.000

但是,這是行不通的。任何人都可以提供一個參考爲什麼?

+9

把單引號周圍 –

+0

除引號,我建議您始終使用安全且明確的格式來保存僅限日期的字符串文字。我唯一信任的是YYYYMMDD。看到我的評論,大衛的答案爲什麼...... –

回答

290
select * 
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01') 

在您的查詢,2010-4-01被視爲一個數學表達式,所以它在本質上閱讀

select * 
from dbo.March2010 A 
where A.Date >= 2005; 

2010 minus 4 minus 1 is 2005 將其轉換爲適當datetime,並使用單引號將修復這個問題。)

從技術上講,解析器可能允許你脫身

select * 
from dbo.March2010 A 
where A.Date >= '2010-04-01' 

它會做轉換爲你,但在我看來,這是不是明確轉換爲DateTime爲維護程序員會來找你的可讀性。

+21

顯式轉換是沒有必要的。另外我強烈建議使用YYYYMMDD而不是YYYY-MM-DD。爲什麼?那麼,用'SET LANGUAGE FRENCH'試試你的代碼。 :-)那天你會得到1月4日而不是4月1日。對於其他日期,你可能會得到一個錯誤。 –

+3

@Aaron Bertrant - 我的答案確實包括了轉換不是必須的,從「從技術上講,pareser可能讓你逃避。我發現它更具可讀性,因爲它很明顯,這是一個日期 - 時間太多的數據庫系統將日期值存儲在一個varchar字段中,但是你對這種格式是正確的。通常,當使用轉換時,我還要添加格式說明符,但是我正在做我的樣本我的頭。 – David

+1

@AaronBertrand,我不得不使用你的建議與上述答案結合:'CONVERT(datetime,'20100401 10:01:01')' - 傳遞2010-04-01在SQL Server Management Studio中工作,但不當通過PHP/MSSQL發送SQL語句時 – paperclip

39

試着把你的日期放入一個字符串中。

select * 
from dbo.March2010 A 
where A.Date >= '2010-04-01'; 
+1

添加時間會給出確切的結果:其中A.Date> = 2014-01-12 12:28:00 – stom

2
DateTime start1 = DateTime.Parse(txtDate.Text); 

SELECT * 
FROM dbo.March2010 A 
WHERE A.Date >= start1; 

先轉換成TexBox日期時間,然後....使用該變量到查詢

7

我們可以使用如下以及

SELECT * 
FROM dbo.March2010 A 
WHERE CAST(A.Date AS Date) >= '2017-03-22'; 

SELECT * 
    FROM dbo.March2010 A 
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840'; 
+2

修改過濾器謂詞列不是一個好主意,它幾乎可以完全防止索引使用。 – pimbrouwers

相關問題