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的主要内容,如果未能解决你的问题,请参考以下文章