数据库大师成长日记:SQL Server如何获取各种特殊日期

SQL Server
384
0
0
2022-04-18

写SQL脚本时间长了,大家就会有一种感觉,那就是日期的运用非常广泛。各种数据和报表统计,往往都少不了对某段日期的数据进行查询和处理。

数据库大师成长日记:SQL Server如何获取各种特殊日期

如果是具体的日期,使用'2018-11-19'这种格式即可满足,但我们统计的往往不是某一个固定日期,而是基于固定日期的某个日期段,比如本月第一天到本月最后一天、上月第一天到上月最后一天等等,那如何才能获取这些特殊的日期点呢?

SQL Server中使用getdate()获取当前时间,dateadd()对日期时间进增加或减少,datediff()计算日期时间之间的差值,datepart()获取日期时间的单项值。

DATEADD增加或减少指定时间

dateadd函数的格式为:DATEADD(datepart,number,date)

其中datepart的含义参看下图,后面datediff和datepart中使用的datepart,也是适用的。

数据库大师成长日记:SQL Server如何获取各种特殊日期

如果觉得使用缩写不够直观,也可以直接使用单词表示,比如年使用year、季度使用quarter、月使用month、日使用day、周使用week、小时使用hour等也是可以的。

DATADIFF两个日期之间的时间

datediff函数的格式为:DATEDIFF(datepart,startdate,enddate)

DATAPART日期/时间的单独部分

datepart函数的格式为:DATEPART(datepart,date)

我下面对常用的特殊日期获取方法做一个整理,权当抛砖引玉,希望对您有所帮助

上个月第一天

select dateadd(dd, -day(dateadd(month, -1, getdate())) + 1, dateadd(month, -1, getdate())) 

上个月最后一天

select dateadd(day, -day(getdate()), getdate()) 

本月第一天

select dateadd(day, -day(getdate()) + 1, getdate()) 

本月最后一天

select dateadd(day, -day(dateadd(month, 1, getdate())), dateadd(month,1 , getdate()))

下个月第一天

select dateadd(day, -day(dateadd(month, 1, getdate())) + 1,dateadd(month, 1, getdate()))

下个月最后一天

select dateadd(day, -day(dateadd(month, 2 ,getdate())), dateadd(month, 2, getdate()))

本周的星期一

select dateadd(week, datediff(week, 0, getdate()), 0)

本季度的第一天

select dateadd(quarter, datediff(quarter, 0, getdate()), 0)

本季度的最后一天

select dateadd(ms, -3, dateadd(quarter, datediff(quarter, 0, getdate()) + 1, 0))

本月的第一个星期一

select dateadd(week, datediff(week, 0, dateadd(day, 6 - datepart(day, getdate()), getdate())), 0) 

本年的第一天

select dateadd(year, datediff(year, 0, getdate()), 0)

本年的最后一天

select dateadd(ms, -3, dateadd(year, datediff(year, 0, getdate()) + 1, 0))

去年的最后一天

select dateadd(ms, -3, dateadd(year, datediff(year, 0, getdate()), 0))