DECLARE @minDate datetime,@maxDate datetime; SELECT @minDate=MIN(date),@maxDate=MAX(date) FROM tb;SELECT DATEADD(day,number,@minDate) AS date FROM master.dbo.spt_values WHERE type = 'p' AND DATEADD(day,number,@minDate) <= @maxDate;
with data as ( select cast('2009-1-1' as datetime) as dt union all select data.dt+1 from data where dt<'2009-1-15' ) select * from data
/* Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3) 愿和大家共同进步 如有雷同、实属巧合 ●●●●●2009-09-25 16:40:11.437●●●●● ★★★★★soft_wsx★★★★★ */ if OBJECT_ID('tb') is not null drop table tb go create table tb(id int,DateFrom datetime, DateTo datetime) insert tb select 1, '2009-01-01', GETDATE() select a.id,convert(nvarchar(10),dateadd(day,b.number,DateFrom),120) as 日期 from tb a inner join master..spt_values b on b.number<=DATEDIFF(day,datefrom,dateto) and b.type='p' /* id 日期 1 2009-01-01 1 2009-01-02 1 2009-01-03 1 2009-01-04 1 2009-01-05 1 2009-01-06 1 2009-01-07 1 2009-01-08 1 2009-01-09 1 2009-01-10 1 2009-01-11 1 2009-01-12 1 2009-01-13 1 2009-01-14 1 2009-01-15 1 2009-01-16 1 2009-01-17 1 2009-01-18 1 2009-01-19 */像这样吗?
--1、得出一天的时间段记录。(如 1:00-2:00) (可以只用一个表) select 时间段=right(100+number,2)+':00-'+right(101+number,2)+':00' from master..spt_values where type='p' and number between 0 and 23
declare @date datetime set @date='2009-01-01'select [day]=ltrim(year(@date))+'-'+right(100+month(@date),2)+'-'+right('0'+ltrim(number),2) from master..spt_values where type='p' and number >=1 and number <= 15 /*day ---------------------- 2009-01-01 2009-01-02 2009-01-03 2009-01-04 2009-01-05 2009-01-06 2009-01-07 2009-01-08 2009-01-09 2009-01-10 2009-01-11 2009-01-12 2009-01-13 2009-01-14 2009-01-15(15 行受影响)*/
from master..spt_values
where type='P' and dateadd(dd,number,'2009-1-1')<='2009-1-15'
/*
-----------------------
2009-01-01 00:00:00.000
2009-01-02 00:00:00.000
2009-01-03 00:00:00.000
2009-01-04 00:00:00.000
2009-01-05 00:00:00.000
2009-01-06 00:00:00.000
2009-01-07 00:00:00.000
2009-01-08 00:00:00.000
2009-01-09 00:00:00.000
2009-01-10 00:00:00.000
2009-01-11 00:00:00.000
2009-01-12 00:00:00.000
2009-01-13 00:00:00.000
2009-01-14 00:00:00.000
2009-01-15 00:00:00.000(15 個資料列受到影響)
*/
SELECT @minDate=MIN(date),@maxDate=MAX(date) FROM tb;SELECT DATEADD(day,number,@minDate) AS date
FROM master.dbo.spt_values
WHERE type = 'p'
AND DATEADD(day,number,@minDate) <= @maxDate;
(
select cast('2009-1-1' as datetime) as dt
union all
select data.dt+1 from data where dt<'2009-1-15'
)
select * from data
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-25 16:40:11.437●●●●●
★★★★★soft_wsx★★★★★
*/
if OBJECT_ID('tb') is not null drop table tb
go
create table tb(id int,DateFrom datetime, DateTo datetime)
insert tb
select
1, '2009-01-01', GETDATE() select a.id,convert(nvarchar(10),dateadd(day,b.number,DateFrom),120) as 日期
from tb a inner join master..spt_values b
on b.number<=DATEDIFF(day,datefrom,dateto) and b.type='p'
/*
id 日期
1 2009-01-01
1 2009-01-02
1 2009-01-03
1 2009-01-04
1 2009-01-05
1 2009-01-06
1 2009-01-07
1 2009-01-08
1 2009-01-09
1 2009-01-10
1 2009-01-11
1 2009-01-12
1 2009-01-13
1 2009-01-14
1 2009-01-15
1 2009-01-16
1 2009-01-17
1 2009-01-18
1 2009-01-19
*/像这样吗?
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
*/
set @date='2009-01-01'select [day]=ltrim(year(@date))+'-'+right(100+month(@date),2)+'-'+right('0'+ltrim(number),2)
from master..spt_values
where type='p'
and number >=1
and number <= 15
/*day
----------------------
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
2009-01-14
2009-01-15(15 行受影响)*/