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

时间:2017-10-09 11:19:19

标签: sql sql-server tsql stored-procedures subquery

我编写了一个查询,该查询返回日期实际上比上述日期早的记录。

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

2 个答案:

答案 0 :(得分:5)

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

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”&lt; “2”。

答案 1 :(得分:0)

为了完成Gordon Linoff的想法,你的代码应该是这样的:

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

编辑:我假设AppliedDateTime实际上存储为日期时间或DATE以外的某种数据类型。 DATE类型的显式CAST将删除时间组件,并允许SQL仅将日期组件与变量进行比较。