计算SQL Server 2012每天的日期范围计数
我在获取以下内容的记录时遇到问题计算SQL Server 2012每天的日期范围计数,sql,sql-server,performance,sql-server-2012,Sql,Sql Server,Performance,Sql Server 2012,我在获取以下内容的记录时遇到问题 | DATEFROM | DATETO | 2012-01-02 | 2012-01-03 | 2012-01-11 | 2012-01-16 | 2012-01-08 | 2012-01-22 | 2012-01-29 | 2012-01-30 | 2012-01-08 | 2012-01-11 我试图获得包含从第一个范围的开始到最后一个范围的最后一个日期的每天的范围计数 样本输出: 2012-01-02 | 1 20
| DATEFROM | DATETO
| 2012-01-02 | 2012-01-03
| 2012-01-11 | 2012-01-16
| 2012-01-08 | 2012-01-22
| 2012-01-29 | 2012-01-30
| 2012-01-08 | 2012-01-11
我试图获得包含从第一个范围的开始到最后一个范围的最后一个日期的每天的范围计数
样本输出:
2012-01-02 | 1
2012-01-03 | 1
2012-01-08 | 2
2012-01-09 | 2
2012-01-10 | 2
2012-01-11 | 3
2012-01-12 | 2
2012-01-13 | 2
2012-01-14 | 2
2012-01-15 | 2
2012-01-16 | 2
......
我的数据库包含从2008年到现在的数据
换句话说,我试图得到一条记录在特定日期被发现的次数。
不是每个月都有一天
我找到了这篇文章,但无法转换提供给我的SQL Server 2012的代码
你可以在这里试试
好的,这是一种做你想做的事情的方法:
DECLARE @MinDate DATE, @MaxDate DATE;
SELECT @MinDate = MIN(DATEFROM),
@MaxDate = MAX(DATETO)
FROM ENTRIES;
WITH Dates AS
(
SELECT DATEADD(DAY,number,@MinDate) [Date]
FROM master.dbo.spt_values
WHERE type = 'P'
AND number > 0
AND DATEADD(DAY,number,@MinDate) <= @MaxDate
)
SELECT A.[Date],
COUNT(*) N
FROM Dates A
LEFT JOIN Entries B
ON A.[Date] >= B.DATEFROM
AND A.[Date] <= B.DATETO
GROUP BY A.[Date]
ORDER BY A.[Date]
如果范围日期超过2047天,则需要创建比master.dbo.spt_值中可用的值更多的值。这很简单,例如,可以使用交叉联接
供您尝试。好的,这是实现您所需的一种方法:
DECLARE @MinDate DATE, @MaxDate DATE;
SELECT @MinDate = MIN(DATEFROM),
@MaxDate = MAX(DATETO)
FROM ENTRIES;
WITH Dates AS
(
SELECT DATEADD(DAY,number,@MinDate) [Date]
FROM master.dbo.spt_values
WHERE type = 'P'
AND number > 0
AND DATEADD(DAY,number,@MinDate) <= @MaxDate
)
SELECT A.[Date],
COUNT(*) N
FROM Dates A
LEFT JOIN Entries B
ON A.[Date] >= B.DATEFROM
AND A.[Date] <= B.DATETO
GROUP BY A.[Date]
ORDER BY A.[Date]
如果范围日期超过2047天,则需要创建比master.dbo.spt_值中可用的值更多的值。这很简单,例如,可以使用交叉联接
让你试试。我肯定有超过2500天的时间。什么是交叉连接?你能解释一下你的代码是如何工作的吗?交叉连接是第一个表的所有行与另一个表的所有行之间的乘法。创建一个从2008年到现在的一整天的表,然后在此基础上构建查询,这是可以想象的,因为有时候更容易,也更有用吗?有时空间与性能是一个很好的选择,我肯定有超过2500天的时间。什么是交叉连接?你能解释一下你的代码是如何工作的吗?交叉连接是第一个表的所有行与另一个表的所有行之间的乘法。创建一个从2008年到现在的一整天的表,然后在此基础上构建查询,这是可以想象的,因为有时候更容易,也更有用吗?有时,空间与性能是一个不错的选择