我正在编写一个会生成每周报告的查询
查询如下所示:
DECLARE @rundate DATETIME
DECLARE @oneweekago AS DATETIME
SELECT @rundate = getdate() - 2
SELECT @oneweekago = DATEADD(week, -1,@rundate)
SELECT
d.date, t2.column1, t1.column2, t1.column3
FROM
table1 t1 WITH (NOLOCK)
INNER JOIN
table2 t2 ON t1.id = t2.id
INNER JOIN
table3 t3 WITH (NOLOCK) ON t3.id = t1.id
INNER JOIN
table4 t4 WITH (NOLOCK) ON t4.id = t1.id
INNER JOIN
table5 t5 WITH (NOLOCK) ON t5.num = i.num
LEFT OUTER JOIN
table6 t6 WITH (NOLOCK) ON t6.intmid = t1.intmid
WHERE
t2.code = '027'
AND t2.status in('O', 'OPEN', 'P', 'PEND', 'PENDING', 'R', 'REOPEN')
AND t3.odate BETWEEN @oneweekago AND @rundate
AND CONVERT(varchar, t3.odate, 101) BETWEEN CONVERT(varchar, @oneweekago, 101) AND CONVERT(varchar, @rundate, 101)
ORDER BY
t1.column1
使用时
CONVERT(varchar, t3.odate, 101) BETWEEN CONVERT(varchar, @oneweekago, 101) AND CONVERT(varchar, @rundate, 101)
该查询为我提供了2009年,2011年,2010年的日期,当时我只指定04/14/2014 - 04/21/2014
的日期(2天前一周)
然而,当我使用
时t3.odate BETWEEN @oneweekago AND @rundate
我得到了正确的结果。
使用CONVERT
方法有什么问题?
由于
答案 0 :(得分:0)
您将datetime值转换为varchar,后者的比较方式不同。 SQL知道如何正确比较日期时间值...没有理由转换到varchar进行比较。如果您需要删除时间部分,您可以进行转换以仅获取日期,但在进行比较之前将其转换回日期格式以获得预期结果。
答案 1 :(得分:0)
您正在转换为varchar - 转换为varchar通常会给您带来意想不到的结果,因为它不会将日期视为日期。它将它视为一个字符串。而当您将结果作为日期保留时,它会正确地比较日期。如果您需要删除时间部分,您只需转换日期:
convert(date, @rundate, 101)