【问题标题】:Why does my query return records which doesn't meet the where clause conditions?为什么我的查询返回不满足 where 子句条件的记录?
【发布时间】:2017-10-09 11:19:19
【问题描述】:

我编写了一个查询,它返回日期实际上早于提到的日期的记录。

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

【问题讨论】:

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


    【解决方案1】:

    您将比较作为 字符串 而不是日期。删除转换:

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

    类型 106 是 dd mm yyyy。当您作为字符串进行比较时,比较的是 strings,而不是日期。对于格式 106,首先比较 ,因此:'18-10-2017' < '25-12-1900' 因为 "1"

    【讨论】:

      【解决方案2】:

      为了完成 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 仅将日期组件与您的变量进行比较。

      【讨论】:

      • 无需将datetime 转换为date 以进行>= 比较。
      • 一个公平的批评,但 OP 没有说明 AppliedDateTime 是如何存储的。显式转换(通常)会起作用,即使该字段是字符串。
      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 2020-07-02
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多