sql - 从当前日期查找前一周/月/季度号
问题描述
我想根据当前日期获取上周、上个月和上个季度的数字(附有年份数字)。
我已经使用 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。如果您特别关注为您的本地时区报告“最后 X”的内容,您可能需要使用 GetDate(),以便“本周”和“上周”等的概念与您当地的午夜概念保持一致/日变
推荐阅读
- sql - varchar to decimal - convert() 错误
- javascript - 如果键存在,则使用键和值形成 JSON
- sql - oracle 与 listagg 不同
- sql-server - SSRS:新页面上的表格,如果它通过分页符
- mysql - 我们如何知道程序成功执行(当有事务时)
- r - 处理非常小的比率以及如何保持指数值
- python - Jupyter notebook 在两个单元格之间运行所有代码
- rally - 从 wsapi 中的 Rally 中的用户故事级别的自定义字段列表填充组合框
- ios - iOS - 如何在使用泛型的类上遵守 NSItemProviderWriting 和 NSItemProviderReading 协议
- angular6 - 如何将 momemt 添加到 Angular-datatable 6.0