为什么我的查询返回不符合where子句条件的记录?

问题描述:

我写了一个查询,它返回的日期实际上比上述日期更早。为什么我的查询返回不符合where子句条件的记录?

Declare @DateFrom date 
Set @DateFrom= '02/Oct/2019' 

SELECT 1, Convert(varchar(11), AppliedDateTime, 106) 
FROM [MC_Tenders].[dbo].[AppliedWorks] 
Where 
Convert(varchar, AppliedDateTime,106) >= Convert(varchar, @DateFrom,106) 

将应用日期保存在表中作为日期时间,例如, 2017-04-25 15:51:25.257

您正在做比较字符串而不是日期。删除转换:

SELECT 1, Convert(varchar(11), AppliedDateTime, 106) 
FROM [MC_Tenders].[dbo].[AppliedWorks] 
WHERE AppliedDateTime >= @DateFrom; 

106型是dd mm yyyy。当你比较字符串时,比较字符串,而不是日期。使用格式106,首先比较,因此:'18-10-2017' < '25-12-1900'因为“1”<“2”。

只是为了完成戈登·利诺夫的思想,你的代码应该是这个样子:

SELECT 
    1 
    , CAST(AppliedDateTime AS DATE) AS AppliedDate 
FROM 
    [MC_Tenders].[dbo].[AppliedWorks] 
WHERE 
    CAST(AppliedDateTime AS DATE) >= @DateFrom; 

编辑:我假设AppliedDateTime实际存储为日期时间,或于DATE其他一些数据类型。对DATE类型的显式CAST将删除时间组件,并允许SQL将日期组件与您的变量进行比较。

+0

对于'> ='比较,不需要将'datetime'强制转换为'date'。 –

+0

一个公平的批评,但OP没有说如何存储AppliedDateTime。即使字段是字符串,显式的转换也会(通常)起作用。 –