写SQL脚本时间长了,大家就会有一种感觉,那就是日期的运用非常广泛。各种数据和报表统计,往往都少不了对某段日期的数据进行查询和处理。
如果是具体的日期,使用'2018-11-19'这种格式即可满足,但我们统计的往往不是某一个固定日期,而是基于固定日期的某个日期段,比如本月第一天到本月最后一天、上月第一天到上月最后一天等等,那如何才能获取这些特殊的日期点呢?
SQL Server中使用getdate()获取当前时间,dateadd()对日期时间进增加或减少,datediff()计算日期时间之间的差值,datepart()获取日期时间的单项值。
DATEADD增加或减少指定时间
dateadd函数的格式为:DATEADD(datepart,number,date)
其中datepart的含义参看下图,后面datediff和datepart中使用的datepart,也是适用的。
如果觉得使用缩写不够直观,也可以直接使用单词表示,比如年使用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))