首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >月粮到日粮

月粮到日粮
EN

Stack Overflow用户
提问于 2015-06-30 00:34:19
回答 1查看 226关注 0票数 2

从月粮到日粮,有没有一条容易的路?例如,这里有一个月粮表:

代码语言:javascript
复制
DECLARE @SessionsPerArea TABLE (idSession INT, startDate DATE)
INSERT  @SessionsPerArea VALUES
(1,'2013-01-31'),
(2,'2013-02-28'),
(3,'2013-03-31')

select *
from @SessionsPerArea

结果:

代码语言:javascript
复制
idSession   startDate
1   2013-01-01
2   2013-02-01
3   2013-03-01

我希望结果如下:

代码语言:javascript
复制
idSession   startDate
1   2013-01-01
1   2013-01-02
1   2013-01-03
.
.
1   2013-01-30
1   2013-01-31
2   2013-02-01
2   2013-02-01
2   2013-02-02
.
.
2   2013-02-27
2   2013-02-28
3   2013-03-01
3   2013-03-02
3   2013-03-03
.
.
3   2013-03-30
3   2013-03-31
EN

回答 1

Stack Overflow用户

发布于 2015-06-30 01:44:09

如果您使用数字表,那么它就简单而高效。下面是一个很好的文章,描述了如何生成它。

在这个例子中,我动态地填充它,但是在生产中,我有一个100 K行的永久表。它在许多报告中都很有用。

代码语言:javascript
复制
DECLARE @Numbers TABLE (Number int PRIMARY KEY);
INSERT INTO @Numbers (Number)
SELECT TOP(100) 
ROW_NUMBER() OVER(ORDER BY sys.all_objects.object_id) AS Number
FROM sys.all_objects;

现在,对于每个会话,我们使用CROSS APPLY返回一个月中的所有日子。此解决方案在startDate上或之前返回每个月的所有天数。如果您的startDate是这个月的最后一天(正如您说的那样),那么每个月的每一天都会有一行。

SQLFiddle

代码语言:javascript
复制
DECLARE @SessionsPerArea TABLE (idSession INT, startDate DATE)
INSERT  @SessionsPerArea VALUES
(1,'2013-01-31'),
(2,'2013-02-28'),
(3,'2013-03-31')

SELECT *
FROM 
    @SessionsPerArea AS S
    CROSS APPLY
    (
        SELECT DATEADD(day, 1-N.Number, S.startDate) AS NewDate
        FROM @Numbers AS N
        WHERE N.Number <= DAY(S.startDate)
    ) AS CA
ORDER BY S.idSession, NewDate;

结果集

代码语言:javascript
复制
idSession    startDate     NewDate
1            2013-01-31    2013-01-01
1            2013-01-31    2013-01-02
1            2013-01-31    2013-01-03
1            2013-01-31    2013-01-04
1            2013-01-31    2013-01-05
1            2013-01-31    2013-01-06
1            2013-01-31    2013-01-07
1            2013-01-31    2013-01-08
1            2013-01-31    2013-01-09
1            2013-01-31    2013-01-10
1            2013-01-31    2013-01-11
1            2013-01-31    2013-01-12
1            2013-01-31    2013-01-13
1            2013-01-31    2013-01-14
1            2013-01-31    2013-01-15
1            2013-01-31    2013-01-16
1            2013-01-31    2013-01-17
1            2013-01-31    2013-01-18
1            2013-01-31    2013-01-19
1            2013-01-31    2013-01-20
1            2013-01-31    2013-01-21
1            2013-01-31    2013-01-22
1            2013-01-31    2013-01-23
1            2013-01-31    2013-01-24
1            2013-01-31    2013-01-25
1            2013-01-31    2013-01-26
1            2013-01-31    2013-01-27
1            2013-01-31    2013-01-28
1            2013-01-31    2013-01-29
1            2013-01-31    2013-01-30
1            2013-01-31    2013-01-31
2            2013-02-28    2013-02-01
2            2013-02-28    2013-02-02
2            2013-02-28    2013-02-03
2            2013-02-28    2013-02-04
2            2013-02-28    2013-02-05
2            2013-02-28    2013-02-06
2            2013-02-28    2013-02-07
2            2013-02-28    2013-02-08
2            2013-02-28    2013-02-09
2            2013-02-28    2013-02-10
2            2013-02-28    2013-02-11
2            2013-02-28    2013-02-12
2            2013-02-28    2013-02-13
2            2013-02-28    2013-02-14
2            2013-02-28    2013-02-15
2            2013-02-28    2013-02-16
2            2013-02-28    2013-02-17
2            2013-02-28    2013-02-18
2            2013-02-28    2013-02-19
2            2013-02-28    2013-02-20
2            2013-02-28    2013-02-21
2            2013-02-28    2013-02-22
2            2013-02-28    2013-02-23
2            2013-02-28    2013-02-24
2            2013-02-28    2013-02-25
2            2013-02-28    2013-02-26
2            2013-02-28    2013-02-27
2            2013-02-28    2013-02-28
3            2013-03-31    2013-03-01
3            2013-03-31    2013-03-02
3            2013-03-31    2013-03-03
3            2013-03-31    2013-03-04
3            2013-03-31    2013-03-05
3            2013-03-31    2013-03-06
3            2013-03-31    2013-03-07
3            2013-03-31    2013-03-08
3            2013-03-31    2013-03-09
3            2013-03-31    2013-03-10
3            2013-03-31    2013-03-11
3            2013-03-31    2013-03-12
3            2013-03-31    2013-03-13
3            2013-03-31    2013-03-14
3            2013-03-31    2013-03-15
3            2013-03-31    2013-03-16
3            2013-03-31    2013-03-17
3            2013-03-31    2013-03-18
3            2013-03-31    2013-03-19
3            2013-03-31    2013-03-20
3            2013-03-31    2013-03-21
3            2013-03-31    2013-03-22
3            2013-03-31    2013-03-23
3            2013-03-31    2013-03-24
3            2013-03-31    2013-03-25
3            2013-03-31    2013-03-26
3            2013-03-31    2013-03-27
3            2013-03-31    2013-03-28
3            2013-03-31    2013-03-29
3            2013-03-31    2013-03-30
3            2013-03-31    2013-03-31
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31127717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档