首页 > 解决方案 > DATEPART:指定不能使用 SET DATEFIRST 时的第一天

问题描述

我正在 ReportServer(动态列表类型)中创建一些报告,其中之一是从 SQL Server 检索过去一周事件的信息。

在 SSMS 中,它很简单,我得到了所需的信息(时间)

... WHERE DATEPART(week, event_date) = DATEPART(week, DATEADD(d, -5, GETDATE()))

前面有一个

SET DATEFIRST 1;

声明,以便将星期一设置为一周的第一天。

不幸的是,ReportServer 不接受该SET DATEFIRST语句作为查询的一部分,因此将其省略后,返回的数据范围是从星期日到星期六,而不是从星期一到星期日。我无法对数据库(或服务器,就此而言)进行全局更改。

我怎样才能绕过这个?

标签: sql-servertsqlreportserver

解决方案


计算所需的一周的第一天,然后在您的条款中使用一周日期范围,where例如

declare @FirstDayOfWeek date, @Now date = getdate();

select @FirstDayOfWeek = dateadd(day, -1*(case when datepart(weekday, @Now) > 1 then datepart(weekday, @Now)-2 else 6 end), @Now);

select *
from dbo.MyTable
where event_date >= @FirstDayOfWeek and event_date < dateadd(week, 1, @FirstDayOfWeek);

当然,您也可以在查询中嵌入计算,例如

select *
from dbo.MyTable
cross join (
  select dateadd(day, -1*(case when datepart(weekday, getdate()) > 1 then datepart(weekday, getdate())-2 else 6 end), getdate()) FirstDayOfWeek
) D
where event_date >= D.FirstDayOfWeek and event_date < dateadd(week, 1, D.FirstDayOfWeek);

注意:您可以将日期计算复制到where子句中并避免join但我不喜欢重复计算。


推荐阅读