sqlserver 取日期和时间问题
刚刚在csdn上看到的几个帖子,对日期或者一天内的时间进行分割的.
一天内的时间段
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
select 时间段=right(100+number,2)+':00-'+right(101+number,2)+':00'
from master..spt_values
where type='p'
and number between 0 and 23
--结果
时间段
00:00-01:00
01:00-02:00
02:00-03:00
03:00-04:00
04:00-05:00
05:00-06:00
06:00-07:00
07:00-08:00
08:00-09:00
09:00-10:00
10:00-11:00
11:00-12:00
12:00-13:00
13:00-14:00
14:00-15:00
15:00-16:00
16:00-17:00
17:00-18:00
18:00-19:00
19:00-20:00
20:00-21:00
21:00-22:00
22:00-23:00
23:00-24:00
一个月内的每一天
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
declare @date datetime
set @date='2009-09-15'
select [day]=convert(varchar(6),@date,112)++right('0'+ltrim(number),2)
from master..spt_values
where type='p'
and number >=1
and number <= datediff(dd,@date,dateadd(month,1,@date))
--结果
day
20090901
20090902
20090903
20090904
20090905
20090906
20090907
20090908
20090909
20090910
20090911
20090912
20090913
20090914
20090915
20090916
20090917
20090918
20090919
20090920
20090921
20090922
20090923
20090924
20090925
20090926
20090927
20090928
20090929
20090930
两个日期之间的日子
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
declare @bt datetime,@et datetime
select @bt='2009-9-15',@et='2009-10-3'
select [day]=datename(dd,DATEADD(dd,number,@bt))+N'日'
from master..spt_values
where type='p'
and number<= datediff(dd,@bt,@et)
--结果
day
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30日
1日
2日
3日
按时间间隔取时间段
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
if OBJECT_ID('fn_time') is not null
drop function fn_time
go
create function fn_time
(@n int)--每隔n小时一段
returns table
as
return(
select 时间段=right(100+number*@n,2)+':00-'+right(100+(number+1)*@n,2)+':00'
from master..spt_values
where type='p'
and number <= 23/@n
and 24%@n=0
)
GO
select * from fn_time(3)
--结果
时间段
00:00-03:00
03:00-06:00
06:00-09:00
09:00-12:00
12:00-15:00
15:00-18:00
18:00-21:00
21:00-24:00
一天内的时间段
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
select 时间段=right(100+number,2)+':00-'+right(101+number,2)+':00'
from master..spt_values
where type='p'
and number between 0 and 23
--结果
时间段
00:00-01:00
01:00-02:00
02:00-03:00
03:00-04:00
04:00-05:00
05:00-06:00
06:00-07:00
07:00-08:00
08:00-09:00
09:00-10:00
10:00-11:00
11:00-12:00
12:00-13:00
13:00-14:00
14:00-15:00
15:00-16:00
16:00-17:00
17:00-18:00
18:00-19:00
19:00-20:00
20:00-21:00
21:00-22:00
22:00-23:00
23:00-24:00
一个月内的每一天
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
declare @date datetime
set @date='2009-09-15'
select [day]=convert(varchar(6),@date,112)++right('0'+ltrim(number),2)
from master..spt_values
where type='p'
and number >=1
and number <= datediff(dd,@date,dateadd(month,1,@date))
--结果
day
20090901
20090902
20090903
20090904
20090905
20090906
20090907
20090908
20090909
20090910
20090911
20090912
20090913
20090914
20090915
20090916
20090917
20090918
20090919
20090920
20090921
20090922
20090923
20090924
20090925
20090926
20090927
20090928
20090929
20090930
两个日期之间的日子
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
declare @bt datetime,@et datetime
select @bt='2009-9-15',@et='2009-10-3'
select [day]=datename(dd,DATEADD(dd,number,@bt))+N'日'
from master..spt_values
where type='p'
and number<= datediff(dd,@bt,@et)
--结果
day
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30日
1日
2日
3日
按时间间隔取时间段
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
if OBJECT_ID('fn_time') is not null
drop function fn_time
go
create function fn_time
(@n int)--每隔n小时一段
returns table
as
return(
select 时间段=right(100+number*@n,2)+':00-'+right(100+(number+1)*@n,2)+':00'
from master..spt_values
where type='p'
and number <= 23/@n
and 24%@n=0
)
GO
select * from fn_time(3)
--结果
时间段
00:00-03:00
03:00-06:00
06:00-09:00
09:00-12:00
12:00-15:00
15:00-18:00
18:00-21:00
21:00-24:00