无需 DATEFIRST 函数或其他数据库对象即可更改周周期范围

问题描述 投票:0回答:1

我正在开发一个使用 T-SQL 语言连接到 Microsoft SQL Server 数据库的 SaaS 应用程序。

我无法开发存储过程、用户定义函数或任何数据库对象。

我正在我的应用程序中使用 T-SQL 语言开发报告;该报告需要生成 周数(给定年份),使用周一到周日的周周期,这显然不是 Microsoft SQL Server 中的默认设置。

我知道如果我写,

SET DATEFIRST 1

它解决了问题。

不幸的是,我也无法使用

DATEFIRST
功能。

我有一个名为

BusinessDate
的列,其数据类型位于名为
dbo.BusinessInformation
的表中。

DATEPART(wk,BusinessDate) AS WeekNumberOfYear

对于上面的

BusinessDate
列,如何在周一到周日的周周期中制定一年中的周数?

如有任何建议,我们将不胜感激。

DECLARE @BusinessInformation TABLE
 ([BusinessDate] [date])

INSERT INTO @BusinessInformation

SELECT '2024-02-16'
UNION ALL
SELECT '2024-02-17'
UNION ALL
SELECT '2024-02-18'
UNION ALL
SELECT '2024-02-19'
UNION ALL
SELECT '2024-02-20'
UNION ALL
SELECT '2024-02-21'
UNION ALL
SELECT '2024-02-22'
UNION ALL
SELECT '2024-02-23'
UNION ALL
SELECT '2024-02-24'
UNION ALL
SELECT '2024-02-25'
UNION ALL
SELECT '2024-02-26'

SET DATEFIRST 7
--default--
--Sunday to Saturday week cycle--

SELECT BusinessDate, DATENAME(dw, BusinessDate) AS WeekdayName, DATEPART(wk,BusinessDate) AS ActualWeekNumberOfYear, DATEADD(dd, -1, BusinessDate) AS SubtractDay, DATEPART(wk,DATEADD(dd, -1, BusinessDate)) AS SubtractDayWeekNumberOfYear
FROM @BusinessInformation
ORDER BY BusinessDate

上面的代码 (SubtractDayWeekNumberOfYear) 有效,但一年的开始和/或结尾(12 月 31 日、1 月 1 日等)的周数不正确。

我需要如下输出:

SET DATEFIRST 1
--Monday to Sunday week cycle--

SELECT BusinessDate, DATENAME(dw, BusinessDate) AS WeekdayName, DATEPART(wk,BusinessDate) AS DATEFIRSTWeekNumberOfYear
FROM @BusinessInformation
ORDER BY BusinessDate
sql-server date t-sql saas week-number
1个回答
0
投票

要在 SQL 中更改一周的开始日期而不使用 DATEFIRST 函数或其他专用数据库对象,您可以依靠一些标准的日期操作技术。本质上,您将调整日期以与您想要的一周开始时间保持一致,调整计算以考虑新的起点。

假设您希望一周从周日开始,而不是通常的周一。以下是对如何调整 SQL 代码以实现此目的的更人性化的细分:

确定当前日期:首先,找出当前是星期几。例如,如果今天是星期二,标准 SQL 函数通常会返回一个指示该情况的值。

计算班次:根据您希望一周开始的那一天,计算需要倒退多少天才能使这一天有效地成为一周的开始。例如,如果您希望星期日作为开始,而今天是星期日,您可以将日期向后移动 6 天,以与从星期一开始的标准周保持一致。

应用班次:使用计算出的班次来调整您当前的日期,以便您对周数和年份转换的计算与这个新的开始日期保持一致。

这是一个简单的 SQL 示例,将星期日设置为一周的第一天:

sql 复制代码 选择 DATEPART(年份,调整日期) AS 年份, DATEPART(周,调整日期) AS 周数, DATEPART(工作日,调整日期) AS 工作日 从 (选择 案件 WHEN DATEPART(weekday, current_date) = 1 THEN DATEADD(day, -6, current_date) -- 如果是星期日,则返回 6 天 ELSE DATEADD(day, 1 - DATEPART(weekday, current_date), current_date) -- 否则,转移到最后一个星期一 结束为调整日期 从 your_table) AS 子查询; 该脚本执行以下操作:

它首先判断今天是否是星期日(DATEPART(weekday, current_date) = 1)。如果是这样,它会减去六天,以使一周的开始与上周一(现在将是一周的最后一天)对齐。 对于任何其他日期,脚本都会将日期移回最近的星期一。这样,无论当天是哪一天,调整后的日期始终在您选择的日期开始的一周内。 请记住测试和调整此代码以适应您的 SQL 环境和数据需求,因为 DATEPART 等函数及其行为可能会因您使用的数据库而略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.