加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

有趣的SQL加入日期之间的日期

发布时间:2020-12-12 16:35:30 所属栏目:MsSql教程 来源:网络整理
导读:首先,感谢任何帮助我解决这个问题的人.我正在使用SQL 2005,但如果05中没有可用的解决方案,可以使用2008. 我有一排数据看起来像这样: select * from mySPtable| myPK | Area | RequestType | StartDate | EndDate | 1 SB ADD 8/14/2011 8/18/2011 2 NB RMV 8/
首先,感谢任何帮助我解决这个问题的人.我正在使用SQL 2005,但如果05中没有可用的解决方案,可以使用2008.

我有一排数据看起来像这样:

select * from mySPtable

| myPK | Area | RequestType |  StartDate  |  EndDate  |
   1      SB        ADD        8/14/2011    8/18/2011
   2      NB        RMV        8/16/2011    8/16/2011

所以我想做的就是每天对每个区域的总请求数.结果应该是:

|  myDate  | RequestType |  Area  | myCount |
  8/14/2011      ADD         SB        1
  8/15/2011      ADD         SB        1
  8/16/2011      ADD         SB        1
  8/16/2011      RMV         NB        1
  8/17/2011      ADD         SB        1
  8/18/2011      ADD         SB        1

我该怎么做呢?我被骗了,没有数量的谷歌搜索有帮助.

解决方法

你需要一个日历表,或者你可以生成一个CTE.一旦你这样做,其余的查询应该是相当微不足道的. CTE方法可能有点复杂,由于递归问题,不允许使用聚合,所以下面我使用了一个表变量.您也可以将其保留在数据库中的永久表.
SET NOCOUNT ON

DECLARE @Calendar TABLE (my_date DATETIME NOT NULL)
DECLARE @date DATETIME,@max_date DATETIME

SELECT @date = MIN(StartDate),@max_date = MAX(EndDate) FROM My_Table

WHILE (@date <= @max_date)
BEGIN
    INSERT INTO @Calendar (my_date) VALUES (@date)
    SELECT @date = DATEADD(dy,1,@date)
END

SELECT
    C.myDate,M.RequestType,M.Area,COUNT(*) AS myCount
FROM
    @Calendar C
INNER JOIN My_Table M ON
    M.StartDate <= C.myDate AND
    M.EndDate >= C.myDate
GROUP BY
    C.myDate,M.Area
ORDER BY
    C.myDate,M.Area

根据您的潜在日期范围有多大,填写表变量可能需要一些时间.例如,如果范围跨越十或二.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读