我想根据当前日期获得上周,上个月和上一季度的数字(加上年份数字)。
我已经使用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。
答案 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