获取日期范围之间的星期一列表

时间:2014-04-10 15:39:56

标签: tsql sql-server-2005

我需要显示N条记录,每条记录的摘要数据为1周。其中一个输入是日期范围。

由于每周应该从星期一开始,我想获得日期范围内所有星期日的列表。有任何建议吗? 注意:这必须在SQL 2005上运行

declare @dt datetime 
SET @dt = '2010-01-01'
declare @dtEnd datetime 
SET @dtEnd = '2010-12-04'
DECLARE @day AS NVARCHAR(30)

WHILE (@dt < @dtEnd) BEGIN
--    insert into table(datefield)
--        values(@dt)
    SET @day =  UPPER(DATENAME(weekday,@dt))
    IF @day = 'MONDAY'
    --PRINT 'date is: ' + CAST(@dt AS VARCHAR(30))
    BEGIN
        PRINT 'date is: ' + CAST(@dt AS VARCHAR(30))  + ' ' + @day
    END
    SET @dt = DATEADD(day, 1, @dt)
END

2 个答案:

答案 0 :(得分:2)

您展示的代码似乎有效,但可以提高效率。我在下面显示的代码将计算开始日期或之后的第一个星期一。然后它在同一个循环中使用,但我们每次只需在循环中添加7天。

declare @dt datetime,
        @dtEnd datetime 

SET @dt = '2010-01-01'
SET @dtEnd = '2010-12-04'

Set @dt = DateAdd(Day, 7 - DateDiff(Day, 0, @dt) % 7, @dt)

WHILE (@dt < @dtEnd) BEGIN
    PRINT 'date is: ' + CAST(@dt AS VARCHAR(30))  + ' ' + DateName(Weekday, @dt)
    SET @dt = DATEADD(day, 7, @dt)
END

我注意到你的代码的一个方面是你正在使用DateName,它可以显示工作日名称,但不太适合做出决定(就像你在做的那样)。 DateName的问题在于它使用当前登录用户的语言设置。

以下代码显示了此行为。

set language 'spanish'
Select DateName(Weekday, GetDate())

set language 'us_english'
Select DateName(Weekday, GetDate())

基本上,如果用户的语言设置为西班牙语,您的代码将失败,但我的代码不会。我的工作是因为它使用的事实是1900年1月1日是星期一。它计算天数并采用其中的mod并使用该mod添加正确的天数。自1900年1月1日起始终是星期一,我们不使用DateName函数,此代码将在不考虑语言设置的情况下工作。

答案 1 :(得分:-1)

SELECT * from table t
WHERE t.date between 'startDate' and 'endDate'
AND (SELECT DATEPART(dw,t.StudyDate))=2
相关问题