s-s-rS 返回不正确的 WW

Posted

技术标签:

【中文标题】s-s-rS 返回不正确的 WW【英文标题】:s-s-rS Returning incorrect WW 【发布时间】:2019-01-07 12:09:01 【问题描述】:

我有一份 s-s-rS 报告 (2008R2 3.0),它使用 YYYYWW 格式的工作周参数过滤器。 2018 年有 52 个基于 ISO 标准 (source) 的工作周。

对于默认参数值,我使用以下公式选择最后一个 WW:

DATEPART(DateInterval.Year, DATEADD("d", -7, now())) & FORMAT(DATEPART(DateInterval.WeekOfYear, DATEADD("d", -7, now())), "00")

由于某种奇怪的原因,它返回了201853。据我了解,它应该是201852,因为运行的日期是20180106

我知道在 T-SQL 中我可以使用 ISO_WEEK 定义返回类型,但在 s-s-rS 中是否有 DateInterval 的等价物?

为了简化:

DATEPART(DateInterval.WeekOfYear, DATEADD("d",-7,now()))

从 201801-201807 运行时返回 53 而不是 52。

知道为什么这会返回错误的 WeekOfYear 值吗?

【问题讨论】:

【参考方案1】:

我认为这可能是由于服务器上的区域每周第一天设置所致。

如果一周的第一天是星期六,那么 2018 年有 53 周。您可以在 SQL Server 中使用 DATEFIRST 设置来设置一周的第一天。

使用SELECT @@DATEFIRST 确定您的服务器设置。

此示例代码将显示差异。

SET DATEFIRST 7
SELECT @@DATEFIRST
SELECT DATEPART(WEEK, '2018-12-30')
SET DATEFIRST 1
SELECT @@DATEFIRST
SELECT DATEPART(WEEK, '2018-12-30')

对于您的查询,您可能需要使用SET DATEFIRST 1 将一周的第一天设置为星期日。

MS Docs: DATEFIRST

【讨论】:

非常感谢。不幸的是,我无法进行服务器端更改,但我已将此标记为答案。 @AJQShake - SET @@DATEFIRST 是本地的,只会影响您的查询 - 它不会更改服务器设置。

以上是关于s-s-rS 返回不正确的 WW的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 向下钻取报告未正确过滤参数

s-s-rS 2012 平均值和中位数

s-s-rS 错误:不支持此类接口

图表构建不正确(MS Visual Studio Reports 2008)

作业活动监视器的下次运行不正确

s-s-rS 空白页