我确定我在这里忽略了一些非常基本的东西,但在查询和谷歌搜索大约一个小时后我无法绕过它。
我有一个日期表已经存在,如果有帮助的话。它填充了过去几年的日期值,并通过服务器上的作业运行的存储过程每晚更新。
我需要做的是将星期一至星期日的时间拉出来,这样我就可以将它们正确地加入到跟踪表中,以获得每周一次的点击图表。我不想写出52个逐渐变大的选择语句,并且出于显而易见的原因将它们联合起来,我不喜欢游标的概念。
我已经用几个月和几天做了这个,但周的性质让我感到困惑,或者它本身就有所不同。
关于如何在没有游标或巨大的选择/联合的情况下自动化过程的任何想法?如果绝对必要的话,我会每晚转移光标并将其转移到一张桌子中,但我希望不会。
仅供参考我想要的格式是:
[Week number] | [StartDate] | [EndDate]
每周
答案 0 :(得分:8)
我可能会偏离你想要的东西,但听起来你想要这样的东西:
- 例如2009年按周分组的记录数
SELECT DATEPART(wk, DateField) AS WeekNumber, COUNT(*) AS HitsForWeek
FROM SomeTable
WHERE DateField >= '20090101' AND DateField < '20100101'
GROUP BY DATEPART(wk, DateField)
答案 1 :(得分:3)
另外还有一件事 - AdaTheDev的答案是正确的,但默认情况下会给你周日到周六的周。如果你想要周一到周日,你必须执行
SET DATEFIRST 1
将一周的第一天设置为星期一(1)。您可以查询@@ DateFirst以查看您的设置 - 默认情况下,它是美国英语配置中的7(星期日)。
答案 2 :(得分:1)
我发现周也很棘手,下面是我用来将日期转换为日期周组的代码。以下是周五周末或周一开始返回的示例,无需维护支持表。如果您想使用它,也可以调整它们以使用星期六和星期日。
--Returns the weekending (Friday) for a particular day
SELECT DATEADD(day, -DATEPART(weekday,yourDate), yourDate)+6
--Returns the week commencing (Monday) for a particular day
SELECT DATEADD(day, -DATEPART(weekday,yourDate)+2, yourDate)
快乐编码:)
答案 3 :(得分:0)
您可能更喜欢使用datediff(day, '19800107', yourDate) / 7
(1980年1月7日是已知的星期一),这样您就不必担心系统何时认为已开始一周。此外,这种机制很容易适应不同的周,而不必考虑@@DATEFIRST
的价值,只选择已知的星期日,或已知的星期四,或其他什么。