2013-05-15 140 views
0

如果我有這種情況,我應該在MS SQL Server中使用什麼正確的日期格式?過濾日期和時間在MS SQL Server中用於日期範圍過濾器

--This values here will be supplied by a datetimepicker Control 
@StartDate = '05/15/2013 10:00 PM' 
@EndDate = '05/16/2013 06:00 AM' 

SELECT * 
FROM tblSomething 
WHERE TransDate >= @StartDate AND TransDate <= @EndDate 

如何格式化TransDate字段?

這是對的嗎?

Declare @StartDate as datetime 
Declare @EndDate as datetime 

set @StartDate = '05/15/2013 10:00 PM' 
set @EndDate = '05/16/2013 06:00 AM' 


Select * from tblSomething Where convert(varchar(20),TransDate,100) >= convert(varchar(20),@StartDate,100) and convert(varchar(20),TransDate,100) <= convert(varchar(20),@EndDate,100) 

原因AM/PM是對我很重要,是因爲我們有有在晚上開始晚上10點至第二天早上6點結束交易的員工。我需要在該時間範圍內提取該員工的交易。

+0

格式化transdate字段?它是什麼數據類型? –

回答

6

如果您需要考慮日期格式,那麼您做錯了。

DateTimePicker控件爲您提供.Net DateTime類型的值。你的TransDate列應該是一個Sql Server DateTime類型,就像你的@StartDate和@EndDate參數一樣。 有史以來在任何時候都不需要表達任何這些字符串。它們應該始終是一種甚至不可讀的二進制格式。如果你已經這樣做了,那麼寫入的select查詢應該可以做你需要的。

下面是一個例子(C#,可以做VB如果你願意)的這一切是如何可能的工作:

//imaginary function to check if there's at least one record in the data range 
bool CheckDates(DateTime startDate, DateTime endDate) 
{ 
    //sql is unchanged from your question 
    string sql = "Select * from tblSomething Where TransDate >= @StartDate AND TransDate <= @EndDate"; 

    using (var cn = new SqlConnection("connection string here")) 
    using (var cmd = new SqlCommand(sql)) 
    { 
     cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate; 
     cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate; 

     cn.Open() 
     using (SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
      //all we care is whether there's at least one row 
      // there is a row if and only if .Read() succeeds 
      return rdr.Read(); 
     } 
    } 
} 

你可以這樣調用它:

//hopefully you picked better control names :) 
if (CheckDates(dateTimePicker1.Value, dateTimePicker2.Value)) 
{ 
    //do something 
} 

的重要的是,您無論在哪裏都不會將該DateTime轉換爲字符串。

+0

是的,我的TransDate字段是DateTime數據類型。 AM/PM對我來說非常重要。我會試一試。 Tnx – user2059064

+0

只是爲了補充您的出色答案,唯一應該處理日期字符串的時間是輸入和輸出。例如,在您輸入/選擇日期時的控件中,輸出日期時在顯示中。在那裏,你需要非常小心地使用正確的語言環境。但一旦這是一個日期,不要把它當作一個字符串。 –

+0

對不起,上面的解決方案返回零結果集。 – user2059064