4

我在 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 年。看起来这一年在比较中被忽略了。我在这里错过了什么吗?

感谢您花时间阅读本文。

4

3 回答 3

6

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

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

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

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

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

于 2012-04-30T21:01:07.230 回答
2

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

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)
于 2012-04-30T21:06:33.640 回答
2

假设fldPublishedDatedatetime, 并且您只想比较date

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

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

在 < SQL 2008 中,您可以使用疯狂的语法:

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

从技术上讲,SQL 会datetime为您转换您的字符串——因此您可以不进行值的转换。

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

于 2012-04-30T21:08:06.570 回答