s-s-rS 未显示日期范围内的所有数据

Posted

技术标签:

【中文标题】s-s-rS 未显示日期范围内的所有数据【英文标题】:s-s-rS not showing all data between date range 【发布时间】:2021-08-30 19:45:30 【问题描述】:

您好,我正在使用 SQL 创建一个报告,显示日期范围之间的 tranx 信息。但是我有一个有趣的问题,我会用下表来说明它

Press Status Date
AB Start 08/01/2021
AB QA Check 08/02/2021
AB Down 08/02/2021
AB Start 08/03/2021
AB Break 08/05/2021
AB No Data 08/07/2021
AB Start 08/07/2021
AB End 08/10/2021

我有一个类似这样的代码:

Select Press, Status, Date
from Table
where Date >= @Date and Date <= @Date

在我的 Sql 开发人员环境中,当我输入 Date >= '08/01/2021' 和 Date

Press Status Date
AB Start 08/01/2021
AB QA Check 08/02/2021
AB Down 08/02/2021
AB Start 08/03/2021
AB Break 08/05/2021

但在我的报告和 s-s-rS 中,我会得到:

Press Status Date
AB Start 08/01/2021
AB QA Check 08/02/2021
AB Down 08/02/2021
AB Start 08/03/2021

正如您所注意到的,在 s-s-rS 中 08/05/2021 值没有填充,但在 s-s-rS 中如果我更改增加 >= 一天 "08/06/2021",我将看到显示 08/05/2021 值的结果。我在 s-s-rS 中是否做错了什么?

【问题讨论】:

这是因为时间戳TRUNC日期 【参考方案1】:

与您传入的变量相比,您的Date 列的数据类型是什么?它们实际上都是数据类型date,还是您正在转换/转换一个?以下代码在 SSMS 和 s-s-rS 中都按预期执行(尽管我不在 2008 年)。

DECLARE @t1 TABLE (Press VARCHAR(10) NOT NULL, Status VARCHAR(20) NOT NULL, SDate DATE NOT NULL)
INSERT INTO @t1
VALUES
('AB',  'Start' ,'08/01/2021'),
('AB',  'QA Check', '08/02/2021'),
('AB',  'Down'  ,'08/02/2021'),
('AB',  'Start' ,'08/03/2021'),
('AB',  'Break' ,'08/05/2021'),
('AB',  'No Data',  '08/07/2021'),
('AB',  'Start',    '08/07/2021'),
('AB',  'End'   ,'08/10/2021')

Select Press, Status, SDate
from @t1
where SDate >='08/01/2021' and SDate <= '08/05/2021'

以下内容丢失了 08/05/2021 行,因为未指定时间是 12:00:00 AM:

DECLARE @t1 TABLE (Press VARCHAR(10) NOT NULL, Status VARCHAR(20) NOT NULL, SDate DATETIME NOT NULL)
INSERT INTO @t1
VALUES
('AB',  'Start' ,'08/01/2021 5:00:00 AM'),
('AB',  'QA Check', '08/02/2021 5:00:00 AM'),
('AB',  'Down'  ,'08/02/2021 5:00:00 AM'),
('AB',  'Start' ,'08/03/2021 5:00:00 AM'),
('AB',  'Break' ,'08/05/2021 5:00:00 AM'),
('AB',  'No Data',  '08/07/2021 5:00:00 AM'),
('AB',  'Start',    '08/07/2021 5:00:00 AM'),
('AB',  'End'   ,'08/10/2021 5:00:00 AM')

Select Press, Status, SDate
from @t1
where SDate >='08/01/2021' and SDate <= '08/05/2021'

【讨论】:

【参考方案2】:

您可能只需将Date 列(我猜是日期时间)转换为仅比较日期部分。

Select Press, Status, Date
from Table
where CAST([Date] as date) >= @Date and CAST([Date] as date) <= @Date

或者,如果您的 @Date 参数只是一个日期,那么只需

Select Press, Status, Date
from Table
where CAST([Date] as date) = CAST(@Date as date)

【讨论】:

以上是关于s-s-rS 未显示日期范围内的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子

MySQL:选择两个日期范围内的所有数据

SQL:如何显示给定范围内的所有日期?

统计日期范围内的天数

使用 Excel 显示日期范围内的出现次数

从 Rails 脚手架显示日期范围内的数据