我有以下查询,该查询应返回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 |
答案 0 :(得分:0)
当然,查询1的问题在于您正在比较字符串。
让我们看看当您将convert
改成nvarchar(10)
的样式103
到06/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
,第一个查询“是否相同”。在将字符串与日期进行比较时,数据类型优先级指示该字符串会自动转换为日期。