sql-server - DATEPART:指定不能使用 SET DATEFIRST 时的第一天
问题描述
我正在 ReportServer(动态列表类型)中创建一些报告,其中之一是从 SQL Server 检索过去一周事件的信息。
在 SSMS 中,它很简单,我得到了所需的信息(时间)
... WHERE DATEPART(week, event_date) = DATEPART(week, DATEADD(d, -5, GETDATE()))
前面有一个
SET DATEFIRST 1;
声明,以便将星期一设置为一周的第一天。
不幸的是,ReportServer 不接受该SET DATEFIRST
语句作为查询的一部分,因此将其省略后,返回的数据范围是从星期日到星期六,而不是从星期一到星期日。我无法对数据库(或服务器,就此而言)进行全局更改。
我怎样才能绕过这个?
解决方案
计算所需的一周的第一天,然后在您的条款中使用一周日期范围,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
但我不喜欢重复计算。
推荐阅读
- material-ui - 为什么 TouchRipple.js 在 material-ui/core v4.7.0 git 标记中与 @material-ui/core 4.7.0 npm 包不同?
- android - 在 gradle 中找不到方法:coreLibraryDesugaringEnabled
- python - 使用 QPixmap 带图像的 Qlabel
- php - 如何根据 a 更改 PHP 变量
- json - C# 中的表达式序列化/反序列化
- clearcase - 设置 clearcase 配置规范并更新另一台机器上存在的快照视图
- r - 如何检测函数是否在 Rstudio 或 Jupyter 笔记本中被调用
- web-services - 如何处理 RIO (soap) System.net 异常吸收 ERemoteable 异常(RIO 和柏林之间的区别)
- wordpress - 您可以使用标准 WP 菜单制作单页菜单吗?
- javascript - onKeyup 事件 myfunction 未返回列表中在文本框中输入的预期匹配数据 obj 它应该过滤列表中的数据