查找当前日期的前一周/月/季度号

时间:2019-01-04 13:31:23

标签: sql sql-server

我想根据当前日期获得上周,上个月和上一季度的数字(加上年份数字)。

我已经使用CONCAT和IIF来获取当前的星期/月份/季度数字并将其减去-1,然后检查是否是上个月/季度处理0值。下面是上个月和下一个季度获得的代码,但是我正在寻找优化的代码以使其更好地工作。同样使用以下类似的代码获取上周编号也会对leap /非non年产生影响。

上个月:

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(基于leap年),上个月应返回12,最后一个季度应返回4。

2 个答案:

答案 0 :(得分:1)

--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()))

通用公式为:

日期和时间,某些时期(周,月,季度,年等)之前:

DATEADD(PERIOD_IDENTIFIER, -NUMBER_OF_PERIODS, CURRENT_DATE)

当时的时期:

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

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

pps;我在上面使用GetUtcDate是因为我通常在UTC工作,因为我的大部分任务都在多国系统上,并且所有时间都是UTC。如果您特别想报告本地时区的“最后X”,则可能需要使用GetDate()来使“本周”和“上周”等概念与本地午夜/日变化

答案 1 :(得分:0)

在SQL Server中使用它。

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