在日历控件中,我们还可以看到上个月和下个月的某些日期。
下面的示例图片(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天。
答案 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