2013-04-10 95 views
2

我有一個SQL Server數據庫,當我在屏幕上打開它時,我希望它只顯示今天已添加的記錄。使用datetime2在今天的日期SQL Server查詢

我有一個存儲在名爲DateAdded的字段中的日期,它是DateTime2數據類型。

我想這

string dateAdded = today.ToShortDateString(); 

string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus 
FROM Customer  
WHERE DateAdded ='" + dateAdded + "'"; 

這顯示沒有記錄,我會假設,因爲它具有存儲的日期時間屬性。

我在網上搜索試圖找到答案,但似乎沒有什麼特定的只是今天添加的記錄。

我還需要根據用戶輸入搜索日期範圍,它可以在任何範圍內,例如從09/01/2013到18/03/2013的查看記錄。

什麼是最好的方式去寫這個sql查詢?

編輯 - 我的回答

答案卡爾給了工作,但我不知道如何改變價值觀,所以我可以有不同的日期範圍。我雖然應該在這裏發佈我的最終結果,我根據收到的答案發布,所以它可能會幫助其他人。 :)

using (SqlConnection conn = new SqlConnection(connectionString)) 
     { 
      int year = date1.Year; 
      int month = date1.Month; 
      int day = date1.Day; 

      string dateAdded = year + "-" + month + "-" + day + " "; 

      int year2 = date2.Year; 
      int month2 = date2.Month; 
      int day2 = date2.Day; 

      string dateAdded2 = year2 + "-" + month2 + "-" + day2 + " "; 

      string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus, DateAdded FROM Customer WHERE DateAdded >= @date1 AND DateAdded <= @date2"; 

      using (SqlCommand cmd = new SqlCommand(query, conn)) 
      { 
       cmd.Parameters.AddWithValue("date1", dateAdded + "00:00:00"); 
       cmd.Parameters.AddWithValue("date2", dateAdded2 + "23:59:59"); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(holder); 
      } 
     } 
+0

您應該使用參數化** **查詢和使用參數爲您要添加的日期;該參數可以是'DateTime'類型,因此可以處理您的數據 – 2013-04-10 09:30:09

+0

請使用參數進行良好實踐。或者更好地使用SQL來實現這一點。 SELECT CONVERT(VARCHAR(8),GETDATE(),1)AS [MM/DD/YY] http://www.sql-server-helper.com/tips/date-formats.aspx – Ash 2013-04-10 09:33:05

+0

轉換非常糟糕。我們應該使用DATEADD(day,DATEDIFF(day,0,GETDATE()),0)。 – 2013-04-10 09:38:21

回答

3

從OP的反應改變了SQL本

DECLARE @StartDate DATETIME2, @EndDate DATETIME2 

SET @StartDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
SET @EndDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()+1), 0) 

SELECT CustomerID, Title, FirstName, LastName, AppStatus 
    FROM Customer  
    WHERE DateAdded >= @StartDate AND DateAdded < @EndDate 

這將讓當前日期任何東西(你可以重新可用性您選擇的日期代替GETDATE() )

+2

但是我會提醒不要使用內聯SQL。這樣會導致潛在的SQL注入攻擊。 – 2013-04-10 09:31:02

+0

反正它不起作用,它什麼都不顯示 – saintsfanuk 2013-04-10 09:36:16

+0

您是否在存儲日期?如果是這樣的話,那麼不,它不會工作,你需要做一個午夜之間/ 23:59:59方法 – 2013-04-10 09:37:16

1

這個怎麼樣:

var sqlCommand = new SqlCommand(); 
sqlCommand.CommandText = "SELECT CustomerID, Title, FirstName, LastName, AppStatus FROM Customer WHERE DateAdded >= @DateAdded"; 
sqlCommand.Parameters.AddWithValue("@DateAdded", DateTime.Today); 
+1

我強烈建議使用這種方法,因爲它首先使用參數,而且不必混淆日期格式和當前文化,其次,您可以安全地使用格式錯誤的sql和注入。 – Oybek 2013-04-10 09:40:40

+0

除了它當然不適用於我的問題,它會,如果它只是我想象的日期字段。 – saintsfanuk 2013-04-10 09:48:43

+0

@saintsfanuk:這是一個簡單的算術錯誤。在where子句中,你必須測試*大於或等於*而不僅僅是*相等*。在改變之後,這個聲明也應該起作用。 – Oliver 2013-04-10 11:01:07

-1

試試你的SQL查詢像下面..

查詢:

string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus FROM Customer 
WHERE CONVERT(VARCHAR(10), dateAdded, 101) = CONVERT(VARCHAR(10), @DateAdded, 101)"; 

Parametized命令:

string dateAdded = today.ToShortDateString(); 
SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = query ; 
cmd.Parameters.AddWithValue("@DateAdded", dateAdded); 
+0

由於沒有數據轉換,DateAdd比轉換效率更高。另外使用where子句左側的轉換是一個巨大的否定。 – 2013-04-10 09:46:08

+0

@CarlSixsmith但用戶保存日期信息與日期和時間...沒有轉換如何匹配日期...? – Pandian 2013-04-10 09:47:44

+0

查看我的答案,對實際數據進行轉換將阻止SQL使用列上的任何索引或統計信息。 – 2013-04-10 09:49:59