繁体   English   中英

从当前日期查找前一周/月/季度数

[英]Find previous week/month/quarter number from current date

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

我已经使用 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。

--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。 如果您特别关注本地时区报告“last X”的内容,您可能需要改用 GetDate() 以便“本周”和“上周”等概念与您当地的午夜概念保持一致/日更

在 SQL Server 中使用它。

select  datepart(mm,getdate()-30) as Last_Month
       ,datepart(qq, getdate()-7) as Last_Quarter
       ,datepart(wk,getdate()-7) as Last_Week

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM