如何获取整个日历月中的所有日期

时间:2016-04-20 08:36:44

标签: sql sql-server tsql calendar

在日历控件中,我们还可以看到上个月和下个月的某些日期。

下面的示例图片

enter image description here

(ie Apr-2016: Starts from Mar-28 and ends in May-08
Mar-2016: Starts from Apr Feb-29 and ends in Apr-10)

在这里,我需要生成特定年份的日历控件中所有日期的列表。我的周开始是周一。 这是我到目前为止尝试过的tsql脚本。

DECLARE @V_DATE DATE = GETDATE()

;WITH CTE_DATE AS (
        SELECT  DATEADD(dd,-(DAY(@V_DATE)-1),@V_DATE) CDATE
        UNION ALL
        SELECT  DATEADD(dd,1,CDATE)
        FROM    CTE_DATE
        WHERE   DATEADD(dd,1,CDATE) <= DATEADD(dd,-(DAY(DATEADD(mm,1,CDATE))),DATEADD(mm,1,CDATE))
    )
SELECT * FROM CTE_DATE

结果是:

2016-04-01
2016-04-02
.
.
2016-04-29
2016-04-30

它将列出输入年份的所有日期,但我需要包括 缺少上个月和下个月的日期。

Apr-2016

的预期结果
2016-03-28
2016-03-29
.
2016-04-15
.
2016-05-07
2016-05-08

May-2016

的预期结果
2016-04-25
2016-04-26
.
2016-05-15
.
2016-06-04
2016-06-05

注意: - 日历控件始终显示42天。

3 个答案:

答案 0 :(得分:1)

因为你的一周是星期一开始的,你可以参考日期0&#39; 1900-01-01&#39;这是星期一。添加41天将为您提供结束日期

select  
      date_fr = dateadd(day, datediff(day, 0, '2016-05-01') / 7 * 7, 0),
      date_to = dateadd(day, datediff(day, 0, '2016-05-01') / 7 * 7, 41)

以下为您提供日期1900-01-01和星期一

select  convert(datetime, 0), datename(weekday, 0)

答案 1 :(得分:1)

您是否考虑过在数据库中创建日期表。您将拥有日期列和周数列。链接到此表,您可以找到开始日期和结束日期的周数,然后您可以重新链接到表格,以查找开始周的第一个日期和结束周的最后日期。这可能比每次步骤的计算效率更高,这是一个简单的链接。

答案 2 :(得分:0)

我为此创建了完成的脚本。这是按照我的期望工作,可能有助于将来参考。 (感谢@Squirrel的逻辑)。

DECLARE @V_ST_DATE  DATE = GETDATE()

SET @V_ST_DATE  =   DATEADD(DAY,-(DAY(@V_ST_DATE)-1),@V_ST_DATE)

SET @V_ST_DATE  =   DATEADD(WEEK,DATEDIFF(WEEK, 0, @V_ST_DATE) ,0) + 
        (CASE WHEN DATEADD(WEEK,DATEDIFF(WEEK, 0, @V_ST_DATE) ,0) > @V_ST_DATE THEN -7 ELSE 0 END)

;WITH CTE_DATE AS (
        SELECT  @V_ST_DATE CDATE,0 TDAYS
        UNION ALL
        SELECT  DATEADD(DAY,1,CDATE) , DATEDIFF(DAY,@V_ST_DATE, DATEADD(DAY,1,CDATE))
        FROM    CTE_DATE
        WHERE   DATEDIFF(DAY,@V_ST_DATE, DATEADD(DAY,1,CDATE)) < 42
    )
SELECT * FROM CTE_DATE