簡體   English   中英

查詢以根據日期條件從SQL Server表返回數據

[英]Query to return data from SQL Server table based on date criteria

我有以下C#代碼段,用於根據日期條件從SQL Server表中選擇一些行。

DateTime From, DateTime To
SqlParameter[] oParam = new SqlParameter[3];
oParam[0] = new SqlParameter("@From", From.Date);
oParam[1] = new SqlParameter("@To", To.Date);
DataTable dt = clsDatabaseHistory.ExecuteReader("SELECT * FROM tblHistory WHERE Date_Requested BETWEEN @From and @To", oParam);

例如,如果From=18/08/2011 18/08/2011To=18/08/2011 18/08/2011且表tblHistory中的數據的Date_Requested值為18/08/2011則查詢不會返回該數據。

但是,如果我將To的值從18/08/2011更改To=19/08/2011 Date_Requested ,則查詢將返回表中所有Date_Requested值為18/08/2011值,但不會從19/08/2011

這樣的事情怎么可能發生,我應該使用什么查詢來返回日期字段在date1和date2之間的行。

就像是 :

select * rows where datevalue >= date1 and datevalue <= date2

謝謝。

From.DateTo.Date在c#端獲取日期部分,而忽略時間部分; 您需要在數據庫端執行類似的操作。

嘗試

"SELECT * FROM tblHistory WHERE cast(Date_Requested as DATE) BETWEEN @From and @To"

刪除時間部分。

編輯:如此答案中所述 ,您可以將@To參數值更改為

      oParam[1] = new SqlParameter("@To", To.Date.AddDays(1));

我敢打賭,您在表中的Date_Requested也有一些時間與之相關-所以它可能實際上是18/08/2011 14:37或類似的時間。

BETWEEN子句將在18/08/2011 00:00:0018/08/2011 00:00:00之間選擇任何內容-基本上什么也沒有。

使用DATETIME時需要考慮的是,事實總是也涉及到TIME

如果您今天想要所有東西,則需要使用:

BETWEEN `18/08/2011 00:00:00` AND `18/08/2011 23:59:59` 

使用這兩個值,您應該獲得帶有Date_Requested今天的所有行。

或:在SQL Server 2008和更高版本中,您還可以使用DATE列類型,該類型僅存儲日期-不涉及時間部分。 在這種情況下,您應該可以使用查詢值。

更改查詢以使用> =和<

select * rows where datevalue >= date1 and datevalue < date2 + 1

您需要考慮時間(不僅僅是日期)。 我處理的一種方式是這樣的:

SELECT
...
WHERE CONVERT(varchar(8), date_begin, 112) <= convert(varchar(8), @to, 112)

它將日期轉換為YYYYMMDD格式(沒有時間),在<, >, =比較中非常容易使用。

好的,謝謝大家,我做了以下事情

oParam[2] = new SqlParameter("@To", To.Date.AddDays(1));

並使用以下選擇

SELECT * from MyTable WHERE CONVERT(varchar(8), Date_Requested, 112) >= CONVERT(varchar(8), @From, 112) and CONVERT(varchar(8), Date_Requested, 112) < CONVERT(varchar(8), @To, 112)

日期時間變量必須進行轉換才能進行比較。

謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM