当前位置: 首页 > 面试题库 >

使用SQL查询,如何选择范围内的每个日期?

楚承天
2023-03-14
问题内容

我正在查询支持凭单数据库,并且每个凭单都有一个列“打开日期”和“关闭日期”。票证经常保持开放状态多天,因此我们需要能够拉出每天开放的票证数量。
例如,对于4/8/14,我们需要知道4/8上已打开多少张票,以及4/8之前已打开但在4的12:00 am仍未打开的未关闭票的总数/
8(在4/8期间或之后可能已关闭,也可能未关闭)。

对于单个日期来说,这似乎足够简单,但是现在我需要编写一个查询,以获取完整的日期范围。
例如,我们需要编写一个查询,该查询返回14年1月1日至14年10月4日之间的每个日期,以及在每个日期(包括打开0张票证的日期)打开的票证总数。

仅使用查询或子查询,而不使用任何存储过程或临时数据表,这可能吗?
目前,我们正在将数据提取到Excel中并在那里计算日期统计信息,但是Excel不是可扩展的解决方案,我们希望SQL执行此工作,因此我们可以将该报表迁移到向下的SSRS(SQL
Server Reporting Services)。路。


问题答案:

您的问题对我来说不是很清楚,但是使用SQLServer 2005或更高版本(对于日期类型为SQLServer
2008或更高版本),您可以创建日历。这是做到这一点的方法

WITH [counter](N) AS
(SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1)
, days(N) AS (SELECT row_number() over (ORDER BY (SELECT NULL)) FROM [counter])
, months (N) AS (SELECT N - 1 FROM days WHERE N < 13)
SELECT DISTINCT CAST(DATEADD(DAY, days.n, 
                             DATEADD(MONTH, months.n, '20131231')
                            ) AS date)
FROM months
     CROSS JOIN days
ORDER BY 1

如果您需要更长的时间,请相应地添加新的CTE



 类似资料:
  • 问题内容: 我有以下SQL(SQL Server 2005),可用于计算每一列的总时间: 这将为上面的项目返回一个包含 1行 的表格,并且效果很好。 我有点不确定如何返回每天/每周/每月的SUM值表,即 日期范围之间每天的所有值的总和。 日期范围内每个WEEK的所有值的总和。 日期范围之间每个MONTH的所有值的总和。 我敢肯定有一个简单的方法可以做到这一点,但我不确定。我看过一些使用DAY(da

  • 我有一个和列在我的表中。所以我试图检查指定的日期是否在这两列的范围内。例如: from_date: 2021-08-26 to_date: 2021-08-29 date: 2021-08-27 我试图使用运算符,但是语法是从相同的列名中选择日期范围。 在我的例子中,我想从不同的列中选择日期范围,比如下面的查询示例。有没有办法做到这一点? 谢谢你!

  • 问题内容: 我有一个表,其中包含许多ID和与每个ID相关联的许多日期,甚至还有一些没有日期的ID。对于每个ID和日期组合,我想选择ID,日期和也与该ID关联的下一个最大日期;如果不存在,则选择null作为下一个日期。 样品表: 所需的输出: 问题答案: SELECT mytable.id, mytable.date, ( SELECT MIN(mytablemin.date) FROM mytab

  • 问题内容: 嗨,我有一个名为“ my_sales”的集合,其字段为product_name,price,sale_date。 我的文档看起来像 我像这样在mongo shell中尝试过 它给出正确的结果。现在我需要使用我尝试过的golang查询同一件事 它给空结果请帮助 问题答案: 氧化镁支持了time.time为BSON日期。 因此,如果您的结构看起来像这样: 然后,您可以像这样查询它:

  • 问题内容: 我在postgres数据库中有一个时间戳字段。我想选择上个月内发生的所有日期。因此,类似于从表中选择 ,其中timestamp>(当前时间戳-1个月)。 问题答案:

  • 问题内容: 我有这个SQL查询: 这将导致类似于以下的输出: 我想每个Foo仅保留第一行,而忽略其余的行。 我怎么做? 问题答案: