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
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)
或
SELECT DATEADD(mm ,DATEDIFF(mm,'1900-01-01 00:00:00.000',getdate()),'1900-01-01 00:00:00.000')
或与年月日来算重点是 ‘01’
3.
4.
5.
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
//as_wk[]:
//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