【问题标题】:Calendar showing null when date begins in previous year日期从上一年开始时显示为空的日历
【发布时间】:2014-01-31 13:45:57
【问题描述】:

这是我用来创建日历的语法。我遇到的问题是,由于 Week1 的开始日期是 2012 年,因此 startdate 显示为空。有没有办法让开始日期(或其他情况下的结束日期)填充,即使它在不同的年份? @变革之风 - - 这增加了之前为空的开始日期和结束日期。但是我所追求的是,​​例如,我需要我的日期范围来运行 Sat - Wed。因此,让我们以 2013 年的第 53 周为例。日期范围应为 2013 年 12 月 28 日 -- 2014 年 1 月 1 日。有没有办法让日历以这种格式显示?

CREATE TABLE dbo.Calendar (
    CalendarYear INT NOT NULL,
    CalendarWeek INT NOT NULL,
    WeekStartDate VARCHAR(50),
    WeekEndDate VARCHAR(50),
    CONSTRAINT PK_Calendar PRIMARY KEY (
        CalendarYear,
        CalendarWeek
        )
    )

SET DATEFIRST 6

DECLARE @StartDate DATETIME,
    @NumOfDays INT

SET @StartDate = '20130101'
SET @NumOfDays = 1000;

WITH calendar
AS (
    SELECT TOP (@NumOfDays) dateadd(day, row_number() OVER (
                ORDER BY sc1.column_id
                ) - 1, @StartDate) AS CalendarDate
    FROM sys.columns sc1
    CROSS JOIN sys.columns sc2
    )
INSERT INTO dbo.Calendar (
    CalendarYear,
    CalendarWeek,
    WeekStartDate,
    WeekEndDate
    )
SELECT DATEPART(year, c.CalendarDate) AS Year,
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,    
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate)
            WHEN 1
                THEN convert(VARCHAR(50), c.CalendarDate, 101)
            ELSE NULL
            END) AS StartDate,
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate)
            WHEN 7
                THEN convert(VARCHAR(50), c.CalendarDate, 101)
            ELSE NULL
            END) AS EndDate
FROM calendar c
GROUP BY DATEPART(year, c.CalendarDate),
    DATEPART(Week, c.CalendarDate)
ORDER BY Year,
    startdate,
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week

SELECT *
FROM dbo.Calendar

【问题讨论】:

    标签: sql sql-server calendar


    【解决方案1】:

    所以您的问题是您按周和年分组,但是在一年的开始/结束时,一年的开始/结束在不同的一周。因此,如果第一周从星期三开始,那一年只有 3 天。

    我有一个小修补程序,我已经让它工作,通过改变周围的东西,它将一年的第一天/最后一天显示为一周的开始/结束日期。这是我的修改版本:

    SELECT
       DATEPART(year, c.CalendarDate) AS Year,
       convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,    
       convert(VARCHAR(50), MIN(c.CalendarDate), 101) AS StartDate,
       convert(VARCHAR(50), MAX(c.CalendarDate), 101) AS EndDate
    FROM 
       calendar c
    GROUP BY 
       DATEPART(year, c.CalendarDate),
       DATEPART(Week, c.CalendarDate)
    ORDER BY 
       Year,
       startdate,
       convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week
    

    希望这会有所帮助。

    编辑:针对您的评论/编辑,请查看这些更新声明。将它们放在插入之后。

    EDIT2:不要使用上述插入以及更新。

    update dbo.Calendar set WeekStartDate = convert(VARCHAR(50), dateadd(day, 1, dateadd(week, -1, cast(WeekEndDate as datetime))), 101)
    where WeekStartdate is null
    
    update dbo.Calendar set WeekEndDate = convert(VARCHAR(50), dateadd(day, -1, dateadd(week, 1, WeekStartDate)), 101)
    where WeekEndDate is null
    

    【讨论】:

    • 在之前为空的地方添加了开始日期和结束日期。但是我所追求的是,​​例如,我需要我的日期范围来运行 Sat - Wed。因此,让我们以 2013 年的第 53 周为例。日期范围应为 2013 年 12 月 28 日 -- 2014 年 1 月 1 日。有没有办法让日历以这种格式显示? (原来的帖子修改了相同的添加)
    • 请查看我的最新更改,看看它们是否有帮助。
    • 这是我得到的输出 2013 53 12/28/2013 12/31/2013 2014 1 01/01/2014 01/03/2014 我能把这个结合起来吗,第 53 周是2013 年 12 月 28 日 - 2014 年 1 月 3 日或第 1 周运行 2013 年 12 月 28 日 - 2014 年 1 月 3 日?
    • 您似乎没有在最后添加我的更新。请检查我在编辑中添加的更新语句。它们应在插入后放入。澄清一下,插入应该恢复到你以前的版本,这不是我以前的插入更改。
    • 啊!你太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2015-02-26
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多