Sql server 来自SQL查询日期的异常结果

Sql server 来自SQL查询日期的异常结果,sql-server,date-arithmetic,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,-41,GETDATE()),103)

我有下面的查询,它应该返回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,-41,GETDATE()),103)
)
这也会产生零行

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

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

让我们看看您提到的3个日期在
转换为
nvarchar(10)
时的样式
103

06/06/2019 
17/06/2019 
18/06/2019
而您的
WHERE
子句本质上是:

database_value <= '19/06/2019'
and
database_value >= '30/05/2019'
数据库_值='30/05/2019'
请注意,作为字符串,“30/05/2019”以“3”开头,因此在字符串比较中比您提到的以“1”或“0”开头的3个值中的任何一个都要大

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


另外,如果您删除
convert
,我真的怀疑第一个查询是否“做同样的事情”。将字符串与日期进行比较时,数据类型优先级指示字符串自动转换为日期

为什么要将日期时间列作为字符串进行比较?Style103表示为
dd/mm/yyyy
,因此不会以您想要的方式进行比较。你为什么这么做?您的查询归结为
,其中'18/06/2019'='30/05/2019'
,这将成为字符串比较而不是日期比较。为什么您首先要将其转换为varchar?为什么不
Bill.InvoiceDate您正在将日期/时间值转换为
varchar
,并希望它们继续像
date
一样工作。
varchar
不是
日期
。当您使用样式代码
103
时,这意味着您的日期格式为
dd/MM/yyyy
。对于这样的值,字符串
'01/01/2019'
'31/12/2000'
之前(是的,我之前说过)。字符串按每个字符从左到右排序<代码>'3'
'0'
所以
'31/12/2000'
'01/01/2019'
之后。不要将您的值转换为
varchar
,很可能这个问题不存在。即使没有转换,它也会这样做
SELECT GETDATE()-21,DATEADD(DAY,-21,GETDATE())
?即使没有转换,它也会这样做
database_value <= '19/06/2019'
and
database_value >= '30/05/2019'