我正在SQL Server 2005上运行查询以查找日期范围内的记录。 WHERE
子句如下所示:
WHERE (CONVERT(NVARCHAR, fldPublishedDate, 101) >= '" & toDate &
"' AND CONVERT(NVARCHAR, fldPublishedDate, 101) <= '" & fromDate & "')"
toDate
和fromDate
的输入方式与04/01/2005
和04/30/2005
类似。
我得到的结果肯定都是在4月1日到30日之间,但是从2005年(数据收集开始时)到2012年的各个年份。看起来这一年在比较中被忽略了。我在这里错过了什么吗?
感谢您抽出宝贵时间阅读本文。
答案 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
来进行比较。您可以将toDate
和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)
答案 2 :(得分:2)
假设fldPublishedDate
是datetime
,并且您只想在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注入和参数 - 它更容易编写,更易于阅读和更安全。赢,赢,赢。