为什么当我使用where /和筛选器强制转换getdate()时查询为空

时间:2018-11-02 18:01:13

标签: sql sql-server syntax sql-server-2014 where-clause

我的表中有很多列,其中一列(ScheduleDate)是日期类型的列,格式为2018-10-31(YYYY-MM-DD)。当我尝试查询表过滤以仅显示未来两天的条目时,它没有结果返回

我的代码

SELECT
    ScheduleDate
  , Customer
  , Status
FROM SomeTable_1
WHERE Status = 'Pending'
AND ScheduleDate = CAST(GETDATE() + 2 AS DATE)

我也尝试过这样的格式化:

AND ScheduleDate = CONVERT(DATE, GETDATE() + 2)

我确定它是语法错误或某些错误,但是SQL Server只是返回带有标头的空结果...


原来我的高级开发人员正在对该表进行更改,并删除了该表中的大多数记录,我们只有下个月的记录。所有人都对,因为记录不存在是正确的,我只是没有刷新SELECT * FROM SOMETABLE结果。当我问他为什么我没有得到结果时,我不确定他为什么不提到他这样做。也许他在恶作剧。感谢您的所有帮助,我现在要去装在笨拙的帽子里,躲在角落里。

1 个答案:

答案 0 :(得分:2)

如果select getdate()返回正确的值(即您的系统时钟正确),那么您要么没有该日期的行,要么谓词WHERE [Status] = 'Pending'的任何结果都不为TRUE行。

使用给定的细节无法重现。

declare @SomeTable_1 table (ScheduleDate date, Customer int, [Status] varchar(16))

insert into @SomeTable_1
values
('20181104',1,'Pending')

SELECT
    ScheduleDate
  , Customer
  , [Status]
FROM @SomeTable_1
WHERE [Status] = 'Pending'
AND ScheduleDate = CAST(GETDATE() + 2 AS DATE)

对于ScheduleDate是否是varchar并将其转换为相等运算符的date也不重要。

declare @SomeTable_1 table (ScheduleDate varchar(16), Customer int, [Status] varchar(16))

insert into @SomeTable_1
values
('2018-11-04',1,'Pending')

SELECT
    ScheduleDate
  , Customer
  , [Status]
FROM @SomeTable_1
WHERE [Status] = 'Pending'
AND ScheduleDate = CAST(GETDATE() + 2 AS DATE)

但是,这很重要,如果它是datetime并且小时/分钟/秒不是00:00:00

declare @SomeTable_1 table (ScheduleDate datetime, Customer int, [Status] varchar(16))

insert into @SomeTable_1
values
('20181104 13:24:00',1,'Pending')

SELECT
    ScheduleDate
  , Customer
  , [Status]
FROM @SomeTable_1
WHERE [Status] = 'Pending'
AND ScheduleDate = CAST(GETDATE() + 2 AS DATE)

值得注意的是,您实际上应该使用dateadd而不是加法运算符。