【问题标题】:Why is my query empty when I use a where/and filter casting getdate() [closed]为什么当我使用 where/and filter cast getdate() 时我的查询为空 [关闭]
【发布时间】:2019-04-07 00:00:47
【问题描述】:

我有一个包含很多列的表,其中一列 (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 结果。当我问他为什么我没有得到任何结果时,我不确定他为什么没有提到他已经这样做了。也许他是在恶作剧我。感谢大家的帮助,我现在要戴上傻帽躲在角落里了。

【问题讨论】:

  • 您确定结果存在于 status = 'Pending' 且 scheduleDate 为 2 天后吗?
  • 是的,在接下来的 30 天里,我每天大约有 75 条记录
  • ScheduleDate 是实际的DATE 列,而不是带有字符串作为日期的(N)VARCHAR 列?您可以在问题中添加示例数据吗?
  • 你不是说-2吧?您明确指出,其值为 20181031,这是 2 天前,而不是 2 天后。另外,就我个人而言,我会使用DATEADD 而不是`+2` (DATEADD(DAY,2,GETDATE()))
  • 正确的 squillman,列数据类型是 DATE 我担心我的服务器有问题,因为我觉得我的语法没有问题...

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


【解决方案1】:

如果 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 而不是加法运算符。

【讨论】:

  • 谢谢,我会进一步研究,我只是在测试中使用加法运算符,最终产品将提取当天的结果,因此将在生产中删除。跨度>
  • 我编辑了第一行...通过运行select getdate() 确保您的系统时钟正确。如果是,那么有些事情没有意义。
  • 我现在感觉自己像个白痴,谢谢你的帮助..请看我对你下面帖子的回答......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多