当前月的第一天和最后一天、上月的第一天和最后一天、每年的第一天和最后一天、每周的第一天和最后一天

1、本月的第一天

前两种方法是网上广为流传的格式,第三种是我自己想出来的。

--(1)先计算出当前时间与1900年01月01日的月份差,然后在1900年01月01日的基础上增加这个月份差,就是当前月的第一天。
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)  
--结果:2018-08-01 00:00:00.000

--(2)先算出当前天数求负数,然后加1天,然后当前的日期-(日期天数-1),那么求得当月1号的日期
SELECT CONVERT(CHAR(10),DATEADD(dd,-DAY(GETDATE())+1,GETDATE()),120)
--结果:2018-08-01

--(3)先求出当前时间120格式的字符串,并截断8位,得到'2018-08',然后加字符串'01',最后用dateadd函数转化。
select dateadd(dd,0,CONVERT(nvarchar(8),GETDATE(),120)+'01');
--结果:2018-08-01 00:00:00.000

2、本月的最后一天

--(1)先计算出当前时间与1900年01月01日的月份差+1,然后在1900年01月01日的基础上增加这个月份差+1,就是当前月的下一个月的01日,然后减去2毫秒。
--网上都是-3毫秒得到997毫秒,经过本人测试-2/-3/-4毫秒得到结果都是997毫秒,如果-5毫秒就得到993毫秒。原因有待探究!
SELECT dateadd(ms,-2,DATEADD(mm, DATEDIFF(mm,0,getdate())+1, 0))
--得到结果:2018-08-31 23:59:59.997

--(2)先求出下个月的第一天,然后减去3毫秒。
select  dateadd(ms,-3,dateadd(mm,1,CONVERT(nvarchar(8),GETDATE(),120)+'01'));
--结果;2018-08-31 23:59:59.997

3、上个月的第一天

--在本月的第一天的基础上减去一个月,就不一一举例了。
SELECT dateadd(mm,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))  
--结果:2018-07-01 00:00:00.000

4、上个月的最后一天

--在本月第一天减去3毫秒
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))  
--结果:2018-07-31 23:59:59.997

5、下个月的第一天

SELECT  DATEADD(mm, DATEDIFF(mm,0,getdate())+1, 0) 
--结果:2018-09-01 00:00:00.000

6、下个月的最后一天

select   dateadd(ms,-3,CONVERT(nvarchar(8),dateadd(mm,2,GETDATE()),120)+'01');

7、本年的第一天

--原理和求本月第一天一样
select dateadd(yy,datediff(yy,0,getdate()),0);
--结果:2018-01-01 00:00:00.000

8、本年最后一天

select dateadd(ms,-3,dateadd(yy,datediff(yy,0,getdate())+1,0));
--结果:2018-12-31 23:59:59.997

9、本周第一天

select dateadd(ww,datediff(ww,0,getdate()),0);
--结果:2018-08-20 00:00:00.000

10、本周最后一天

select dateadd(ms,-3,dateadd(ww,datediff(ww,0,getdate())+1,0));
--结果:2018-08-26 23:59:59.997

后记:

        每个人的理解不同,可以将以上的函数随意组合求得所需时间。大家有更简单、更易理解的可以互相交流学习。

猜你喜欢

转载自blog.csdn.net/lanxingbudui/article/details/81707080
今日推荐