SQL日期函数应用

Declare @d DATETIME
set @d = '2008-05-21'
select @d as 当前时间
--1、当前时间周的星期一
SELECT  DATEADD(wk,  DATEDIFF(wk,0,@d),  0)  as 当前时间周的星期一

--2、当前时间周的星期日
SELECT  DATEADD(wk,  DATEDIFF(wk,0,@d),  0)+6 当前时间周的星期日

--3、当前时间月的星期一
SELECT  DATEADD(mm,  DATEDIFF(mm,0,@d),  0) + 9 - datepart(dw, DATEADD(mm,  DATEDIFF(mm,0,@d),  0)) 当前时间月的星期一
--4、当前时间月的星期日
SELECT  DATEADD(mm,  DATEDIFF(mm,0,@d),  0) + 8 - datepart(dw, DATEADD(mm,  DATEDIFF(mm,0,@d),  0)) 当前时间月的星期日
--5、当前时间月的总天数

SELECT 当前时间月的总天数1=DAY(dateadd(ms,-100,DATEADD(mm, DATEDIFF(m,0,@d)+1,0)))
SELECT 当前时间月的总天数2=32-DAY(@d-DAY(@d)+32) --此条收录于网上




/*   
                                                    
当前时间                                                   
------------------------------------------------------ 
2008-04-21 00:00:00.000

当前时间周的星期一                                              
------------------------------------------------------ 
2008-04-21 00:00:00.000

当前时间周的星期日                                              
------------------------------------------------------ 
2008-04-27 00:00:00.000

当前时间月的星期一                                              
------------------------------------------------------ 
2008-04-07 00:00:00.000

当前时间月的星期日                                              
------------------------------------------------------ 
2008-04-06 00:00:00.000

当前时间月的总天数1  
----------- 
30

当前时间月的总天数2  
----------- 
30


*/


--以下收录于网上

DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=3

--1.指定日期该年的第一天或最后一天
--A. 年的第一天
SELECT CONVERT(char(5),@dt,120)+'1-1'

--B. 年的最后一天
SELECT CONVERT(char(5),@dt,120)+'12-31'


--2.指定日期所在季度的第一天或最后一天
--A. 季度的第一天
SELECT CONVERT(datetime,
    CONVERT(char(8),
        DATEADD(Month,
            DATEPART(Quarter,@dt)*3-Month(@dt)-2,
            @dt),
        120)+'1')

--B. 季度的最后一天(CASE判断法)
SELECT CONVERT(datetime,
    CONVERT(char(8),
        DATEADD(Month,
            DATEPART(Quarter,@dt)*3-Month(@dt),
            @dt),
        120)
    +CASE WHEN DATEPART(Quarter,@dt) in(1,4)
        THEN '31'ELSE '30' END)

--C. 季度的最后一天(直接推算法)
SELECT DATEADD(Day,-1,
    CONVERT(char(8),
        DATEADD(Month,
            1+DATEPART(Quarter,@dt)*3-Month(@dt),
            @dt),
        120)+'1')


--3.指定日期所在月份的第一天或最后一天
--A. 月的第一天
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

--B. 月的最后一天
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

--C. 月的最后一天(容易使用的错误方法)
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))


--4.指定日期所在周的任意一天
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)


--5.指定日期所在周的任意星期几
--A.  星期天做为一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)

--B.  星期一做为一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)

/*
-------- 
2008-1-1

           
---------- 
2008-12-31

                                                       
------------------------------------------------------ 
2008-04-01 00:00:00.000

                                                       
------------------------------------------------------ 
2008-06-30 00:00:00.000

                                                       
------------------------------------------------------ 
2008-06-30 00:00:00.000

                                                       
------------------------------------------------------ 
2008-05-01 00:00:00.000

                                                       
------------------------------------------------------ 
2008-05-31 00:00:00.000

                                                       
------------------------------------------------------ 
2008-05-30 14:32:08.963

                                                       
------------------------------------------------------ 
2008-05-20 14:32:08.963

                                                       
------------------------------------------------------ 
2008-05-21 14:32:08.963

                                                       
------------------------------------------------------ 
2008-05-21 14:32:08.963

*/

一周的第一天
select @@DATEFIRST

一个月的第一天  
select dateadd(mm,datediff(mm,0,getdate()),0)

本周的星期一  
select dateadd(wk,datediff(wk,0,getdate()),0)

一年的第一天  
SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)  

季度的第一天  
SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)  

当天的零时
SELECT  DATEADD(dd,  DATEDIFF(dd,0,getdate()),  0)  

上个月的最后一天  :本月第一天减2ms.
SELECT  dateadd(ms,-2,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  

本月的最后一天  
SELECT  dateadd(ms,-2,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)) 

本月的第一个星期一     

去掉时分秒  
DATEADD(day,  DATEDIFF(day,0,getdate()),  0)  
显示星期几  
select  datename(weekday,getdate())    
如何取得某个月的天数  
SELECT  Day(dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)))  

判断是否闰年:  
SELECT  case  day(dateadd(mm,  2,  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))))  
when  28  then  '平年'  else  '闰年'  end  
一个季度多少天  
declare  @m  tinyint,@time  smalldatetime  
select  @m=month(getdate())  
select  @m=case  when  @m  between  1  and  3  then  1  
                       when  @m  between  4  and  6  then  4  
                       when  @m  between  7  and  9  then  7  
                       else  10  end  
select  @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'  
select  datediff(day,@time,dateadd(mm,3,@time))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值