SQL Server日期比较忽略年份

时间:2012-04-30 20:57:05

标签: sql sql-server sql-server-2005

我正在SQL Server 2005上运行查询以查找日期范围内的记录。 WHERE子句如下所示:

WHERE (CONVERT(NVARCHAR, fldPublishedDate, 101) >= '" & toDate & 
   "' AND CONVERT(NVARCHAR, fldPublishedDate, 101) <= '" & fromDate & "')"

toDatefromDate的输入方式与04/01/200504/30/2005类似。

我得到的结果肯定都是在4月1日到30日之间,但是从2005年(数据收集开始时)到2012年的各个年份。看起来这一年在比较中被忽略了。我在这里错过了什么吗?

感谢您抽出宝贵时间阅读本文。

3 个答案:

答案 0 :(得分:6)

为什么要转换为字符串?当然,这不能按预期工作。你说的是:

IF '12/02/2010' > '09/12/2012'

当然这是真的。你应该说:

WHERE fldPublishedDate >= '20050401'
  AND fldPublishedDate < DATEADD(DAY, 1, '20050430');

仅当您只比较日期范围时,才需要将列转换为日期。最重要的是,您应该以明确的格式传递日期,这种格式不受区域和语言设置的影响(例如YYYYMMDD)。 101不是一种安全的风格,因为英国人在哪个月是04/06/2012?那是6月,而不是4月。我怀疑你应该在你的(经典ASP?)代码中更好地格式化这些日期,或者从你正在使用的任何语言中传入适当的日期时间数据类型。最后,不要在没有长度的情况下使用NVARCHAR:

答案 1 :(得分:2)

如果fldPublishedDate是SQL服务器中的日期,那么为什么要将其转换为nvarchar来进行比较。您可以将toDatefromDate转换为日期时间并进行比较

declare @toDate nvarchar(50)
declare @fromDate nvarchar(50)

set @toDate  = '04/01/2005'
set @fromDate  = '04/30/2005'

select cast(@toDate as datetime), cast(@fromDate as datetime)

results:
ToDate                      FromDate
2005-04-01 00:00:00.000     2005-04-30 00:00:00.000

然后在你的WHERE条款中:

WHERE fldPublishedDate >= cast(@toDate as datetime)
 AND fldPublishedDate <= cast(@fromDate as datetime)

答案 2 :(得分:2)

假设fldPublishedDatedatetime,并且您只想在date进行比较。

在SQL 2008中,使用方便的日期类型:

WHERE CONVERT(date, fldPublishedDate) >= CONVERT(date, '" & toDate & 
"' AND CONVERT(date, fldPublishedDate) <= CONVERT(date, '" & fromDate & "'"

In&lt; SQL 2008,你可以使用疯狂的语法:

WHERE DATEADD(dd, DATEDIFF(dd, 0, fldPublishedDate), 0) >= CONVERT(datetime, '" & toDate & 
"' AND DATEADD(dd, DATEDIFF(dd, 0, fldPublishedDate), 0) <= CONVERT(datetime, '" & fromDate & "'"

Tehcnically,SQL会为您转换datetime个字符串 - 因此您可以不使用您的值转换。

此外,您应该阅读SQL注入和参数 - 它更容易编写,更易于阅读和更安全。赢,赢,赢。