首页 > 解决方案 > 从当前日期查找前一周/月/季度号

问题描述

我想根据当前日期获取上周、上个月和上个季度的数字(附有年份数字)。

我已经使用 CONCAT 和 IIF 来获取当前的周/月/季度数字并用 -1 减去它,然后检查它是否是上个月/季度来处理 0 值。以下是上个月和上季度获得的代码,但是我正在寻找优化的代码以使其更好地工作。使用类似于下面的代码获取上周的数字也会有闰年/非闰年的问题。

上个月:

SELECT CONCAT(YEAR(GETDATE()),IIF(DATEPART(MONTH,GETDATE())-1=0,12,DATEPART(MONTH,GETDATE())-1))

上一季度:

SELECT CONCAT(YEAR(GETDATE()),IIF(DATEPART(QUARTER,GETDATE())-1=0,4,DATEPART(QUARTER,GETDATE())-1))

例如,如果我的当前日期是 2019 年 1 月 4 日 - 上周应返回 52 或 53(基于闰年),上个月应返回 12,上季度应返回 4。

标签: sqlsql-server

解决方案


--a week ago
select DATEADD(WEEK, -1, GETUTCDATE())

--the week number(of year), a week ago
select DATEPART(WEEK, DATEADD(WEEK, -1, GETUTCDATE()))

--a month ago
select DATEADD(MONTH, -1, GETUTCDATE())

--the month number, a month ago
select DATEPART(MONTH, DATEADD(MONTH, -1, GETUTCDATE()))

--a quarter ago
select DATEADD(QUARTER, -1, GETUTCDATE())

--the quarter number, a quarter ago
select DATEPART(QUARTER, DATEADD(QUARTER, -1, GETUTCDATE()))

因此,一般公式为:

日期和时间,某个 PERIOD(周、月、季度、年等)前:

DATEADD(PERIOD_IDENTIFIER, -NUMBER_OF_PERIODS, CURRENT_DATE)

当时的时期:

DATEPART(PERIOD_IDENTIFIER, DATEADD(PERIOD_IDENTIFIER, -NUMBER_OF_PERIODS, CURRENT_DATE))

ps; 每年有 53 周,而不仅仅是闰年,因为 365/7 略高于 52

pps; 我在上面使用了 GetUtcDate,因为我通常在 UTC 工作,因为我的大部分任务都在多国系统上,而且所有时间都是 UTC。如果您特别关注为您的本地时区报告“最后 X”的内容,您可能需要使用 GetDate(),以便“本周”和“上周”等的概念与您当地的午夜概念保持一致/日变


推荐阅读