SQL中各种日期的算法

SQL中各种日期的算法:

1. 通过 @@DATEFIRST 函数来检查第一天设置
日期部分
缩写
年 year
yy、yyyy
季 quarter
qq、q
月 month
mm、m 、mmm(英文缩写)
一年当中的第几天 dayofyear
dy、y
日 day
dd、d
周 week
wk、ww
星期几* weekday
Dw(weekday)
时 hour
hh
分 minute
mi、n
秒 second
ss、s
毫秒 millisecond
ms

2. 当前月的第一天
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) SQL server

SELECT DATEADD(mm ,DATEDIFF(mm,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000') 通用 '1900-01-01 00:00:00.000' 也可以是个固定日期 (yyyy-10-01) 不带时间
或与年月日来算重点是 ‘01’
3. 本周的星期一 ( 而不是第一天 ), mm wk
4. 当前年的第一天 (yy) , 季度的第一天 (qq), 当天的半夜 (dd)
5. 利用时间间隔数量计算上个年度 , 上个月 …. 逻辑是第一天减去 3 毫秒
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,'1900-01-01',getdate()), '1900-01-01'))
Go--( 上月最后一天 )
6. 利用时间间隔数量计算本年度 , 本月的最后一天 逻辑是上个的最后一天再加一个单位量
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,'1900-01-01',getdate())+1, '1900-01-01'))
Go--( 本月最后一天 )
7. 本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,'1900-01-01',  
dateadd(dd,6-datepart(day,getdate()),getdate())  ), '1900-01-01')
go
8. 如何取得某个月的天数
   declare @m int  
   set @m=2 -- 月份
   select datediff(day,’2003-’+cast(@m as varchar)+’-15’ ,’2003-’+cast(@m+1 as varchar)+’-15’)  
  另外,取得 本月天数
   select datediff(day,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate()) as varchar)+’-15’ ,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate())+1 as varchar)+’-15’)  
  或者使用计算本月的最后一天的脚本,然后用 DAY 函数区最后一天
   SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,'1900-01-01',getdate())+1, '1900-01-01')))
Go
9. 一个季度多少天
利用季度的第一天与最后一天计算
           SELECT datediff(day,
dateadd(qq ,datediff(qq,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
,
dateadd(ms,-3,dateadd(qq, datediff(qq,'1900-01-01',getdate())+1, '1900-01-01'))
)
go

SELECT datediff(dd,
dateadd(qq ,datediff(qq,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
dateadd(mm,3,
dateadd(qq ,datediff(qq,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
) -1
go

SELECT datediff(dd,
dateadd(qq ,datediff(qq,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
,
dateadd(mm,3,
dateadd(qq ,datediff(qq,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
)
) - 1
go


   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))
10. 以星期一为第一天分配对应周时间的时间范围(日期范围)
// 功能 : 根据 adt_curdate 日期月份分析对应月份的周数及对应的周起止日期 .
// 返回 : 日期的对应周
//adt_curdate
//as_wk[]: 对应月份的周 ('1' 第一周 ....)
//adt_start[]: 对应周的起始日期
//adt_end[]  : 对应周的截止日期

long i,ll_wk,ll_pwk,j
string ls_wk[],ls_return,ls_isdate
datetime ldt_start[],ldt_end[],ldt_mdate
/*
select
case datename(dw,getdate())  
when 'Monday'              then 1         when 'Tuesday'    then 2 when 'Wednesday' then 3
when 'Thursday' then 4          when 'Friday'         then 5 when          'Saturday'    then 6 when 'Sunday' then 7
end
*/

as_wk[]=ls_wk[]
adt_start[]=ldt_start[]
adt_end[]=ldt_end[]

For i=1 To 31
           ls_isdate=string(year(date(adt_cusdate)))+'-'+string(month(date(adt_cusdate)))+'-'+string(i,'00')
           If isdate(ls_isdate) Then // 有效日期
                     ldt_mdate=datetime(date(ls_isdate))
                     // 取处于对应的周 ( 以星期一为第一天 )
                     select wknum  into : ll_wk
                     from(
                     select
                     case datename(dw,:ldt_mdate)  
                     when 'Monday'              then 1         when 'Tuesday'    then 2 when 'Wednesday' then 3
                     when 'Thursday' then 4          when 'Friday'         then 5 when          'Saturday'    then 6 when 'Sunday' then 7
                     end as wknum) a
                     ;
                     If ll_wk >0 Then
                                If ll_wk > ll_pwk and ll_pwk >0 then
                                           ldt_end[upperbound(ldt_end[])]    =ldt_mdate
                                Else
                                           j=j+1// 周数自动加一
                                           ls_wk[upperbound(ls_wk[]) + 1]=string(j)
                                           ldt_start[upperbound(ldt_start[]) + 1]=ldt_mdate
                                           ldt_end[upperbound(ldt_end[]) + 1]    =ldt_mdate
                                End If
                                ll_pwk=ll_wk

                                If ll_wk < 6 and i + (6 - ll_wk) < 28 Then // 减少循环次数
                                           i = i + (6 - ll_wk)
                                End If
                                // 对应的周
                                If ldt_start[upperbound(ldt_start[])]<=adt_cusdate and adt_cusdate <=ldt_end[upperbound(ldt_end[])] Then
                                           ls_return = string(upperbound(ls_wk[]))
                                End If

                     End If

           End If

Next

as_wk[]=ls_wk[]
adt_start[]=ldt_start[]
adt_end[]=ldt_end[]

Return ls_return

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值