SQL查询日期的异常结果

时间:2019-07-10 07:57:01

标签: sql-server date-arithmetic

我有以下查询,该查询应返回3行,但是不返回任何行。但是,如果我运行第二个查询,则会得到所需的3行。

谁能解释为什么第一个不返回预期结果集?即使我删除了转换,它仍然会执行同样的操作。

3行应为2019-06-18、2019-06-06、2019-06-17 这会根据当前日期(2019-06-10)返回零行

(
    CONVERT(VARCHAR(10), Bill.InvoiceDate, 103) <= CONVERT(VARCHAR(10), DATEADD(DAY, -21, GETDATE()), 103)  
    AND 
    CONVERT(VARCHAR(10), Bill.InvoiceDate, 103) >= CONVERT(VARCHAR(10), DATEADD(DAY, -41, GETDATE()), 103) 
)

这也会产生零行

(
    Bill.InvoiceDate <= DATEADD(DAY, -21, GETDATE())
    AND 
    Bill.InvoiceDate >= DATEADD(DAY, -41, GETDATE())
)

这将返回上面显示的3行

(
    Bill.InvoiceDate <= (GETDATE()-21)
    AND
    Bill.InvoiceDate >= (GETDATE()-41)
)

根据Sami的评论,我完成了以下操作,它们返回的结果相同

SELECT GETDATE()-21, DATEADD(DAY, -21, GETDATE())
| No column name          | No column name          |
|-------------------------|-------------------------|
| 2019-06-19 09:52:23.240 | 2019-06-19 09:52:23.240 |

1 个答案:

答案 0 :(得分:0)

当然,查询1的问题在于您正在比较字符串。

让我们看看当您将convert改成nvarchar(10)的样式10306/06/2019 17/06/2019 18/06/2019 时,您提到的3个日期是什么样的:

WHERE

和您的database_value <= '19/06/2019' and database_value >= '30/05/2019' 子句实质上是:

convert

请注意,'30 / 05/2019'作为字符串,以'3'开头,因此在字符串比较中比您提到的以'1'或'0'开头的3个值大。

因为您确实要比较日期,所以第二个查询是正确的。

作为另外的通知,我真的怀疑如果删除toFixed,第一个查询“是否相同”。在将字符串与日期进行比较时,数据类型优先级指示该字符串会自动转换为日期。