2013-04-10 52 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