SQL:使用日期转换功能时获得不同的结果

时间:2014-04-23 16:30:23

标签: sql sql-server

我正在编写一个会生成每周报告的查询

查询如下所示:

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方法有什么问题?

由于

2 个答案:

答案 0 :(得分:0)

您将datetime值转换为varchar,后者的比较方式不同。 SQL知道如何正确比较日期时间值...没有理由转换到varchar进行比较。如果您需要删除时间部分,您可以进行转换以仅获取日期,但在进行比较之前将其转换回日期格式以获得预期结果。

答案 1 :(得分:0)

您正在转换为varchar - 转换为varchar通常会给您带来意想不到的结果,因为它不会将日期视为日期。它将它视为一个字符串。而当您将结果作为日期保留时,它会正确地比较日期。如果您需要删除时间部分,您只需转换日期:

convert(date, @rundate, 101)