我需要显示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
答案 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