Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算SQL Server 2012每天的日期范围计数_Sql_Sql Server_Performance_Sql Server 2012 - Fatal编程技术网

计算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年到现在的一整天的表,然后在此基础上构建查询,这是可以想象的,因为有时候更容易,也更有用吗?有时,空间与性能是一个不错的选择