为什么我的查询返回不符合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将日期组件与您的变量进行比较。
对于'> ='比较,不需要将'datetime'强制转换为'date'。 –
一个公平的批评,但OP没有说如何存储AppliedDateTime。即使字段是字符串,显式的转换也会(通常)起作用。 –