34,590
社区成员
发帖
与我相关
我的任务
分享
create table tb(startTime datetime, endTime datetime, price int)
insert into tb values('2008-09-12' , '2008-09-14' , 500)
insert into tb values('2008-09-15' , '2008-09-19' , 400)
insert into tb values('2008-09-20' , '2008-09-21' , 300)
insert into tb values('2008-09-23' , '2008-09-28' , 200)
insert into tb values('2008-09-28' , '2008-09-29' , 100)
go
--定义起始和结束时间
declare @startTime as datetime
declare @endTime as datetime
set @startTime = '2008-09-13'
set @endTime = '2008-09-25'
--这样最简洁:
select * from tb where not ( @endTime<startTime or @startTime > endTime)
drop table tb
/*
startTime endTime price
------------------------------------------------------ ------------------------------------------------------ -----------
2008-09-12 00:00:00.000 2008-09-14 00:00:00.000 500
2008-09-15 00:00:00.000 2008-09-19 00:00:00.000 400
2008-09-20 00:00:00.000 2008-09-21 00:00:00.000 300
2008-09-23 00:00:00.000 2008-09-28 00:00:00.000 200
(所影响的行数为 4 行)
*/
select * from a
where startTime between '2008-09-13' and '2008-09-25'
and endtime between '2008-09-13' and '2008-09-25'
startTime endTime price
---------------------------------- -------------------------------- -----------
2008-09-12 00:00:00.000 2008-09-14 00:00:00.000 500
2008-09-15 00:00:00.000 2008-09-19 00:00:00.000 400
2008-09-20 00:00:00.000 2008-09-21 00:00:00.000 300
2008-09-23 00:00:00.000 2008-09-28 00:00:00.000 200
(所影响的行数为 4 行)
create table tb(startTime datetime, endTime datetime, price int)
insert into tb values('2008-09-12' , '2008-09-14' , 500)
insert into tb values('2008-09-15' , '2008-09-19' , 400)
insert into tb values('2008-09-20' , '2008-09-21' , 300)
insert into tb values('2008-09-23' , '2008-09-28' , 200)
insert into tb values('2008-09-28' , '2008-09-29' , 100)
go
--定义起始和结束时间
declare @startTime as datetime
declare @endTime as datetime
set @startTime = '2008-09-13'
set @endTime = '2008-09-25'
select * from tb where startTime between @startTime and @endTime or endTime between @startTime and @endTime
drop table tb
/*
startTime endTime price
------------------------------------------------------ ------------------------------------------------------ -----------
2008-09-12 00:00:00.000 2008-09-14 00:00:00.000 500
2008-09-15 00:00:00.000 2008-09-19 00:00:00.000 400
2008-09-20 00:00:00.000 2008-09-21 00:00:00.000 300
2008-09-23 00:00:00.000 2008-09-28 00:00:00.000 200
(所影响的行数为 4 行)
*/
create table tb(startTime datetime, endTime datetime, price int)
insert into tb values('2008-09-12' , '2008-09-14' , 500)
insert into tb values('2008-09-15' , '2008-09-19' , 400)
insert into tb values('2008-09-20' , '2008-09-21' , 300)
insert into tb values('2008-09-23' , '2008-09-28' , 200)
insert into tb values('2008-09-28' , '2008-09-29' , 100)
go
--使用一个临时表
select top 8000 identity(int,0,1) as id into # from syscolumns a,syscolumns b
--定义起始和结束时间
declare @startTime as datetime
declare @endTime as datetime
set @startTime = '2008-09-13'
set @endTime = '2008-09-25'
select distinct m.* from tb m ,
(select dateadd(day , t.id , @startTime) id from # t where dateadd(day , t.id , @startTime) <= @endTime) n
where n.id between m.startTime and m.endTime
order by m.price desc
drop table tb,#
/*
startTime endTime price
------------------------------------------------------ ------------------------------------------------------ -----------
2008-09-12 00:00:00.000 2008-09-14 00:00:00.000 500
2008-09-15 00:00:00.000 2008-09-19 00:00:00.000 400
2008-09-20 00:00:00.000 2008-09-21 00:00:00.000 300
2008-09-23 00:00:00.000 2008-09-28 00:00:00.000 200
(所影响的行数为 4 行)
*/
--使用一个临时表
select top 8000 identity(int,0,1) as id into # from syscolumns a,syscolumns b
select id from
(
select dateadd(day , t.id , '2008-1-1') id from # t where dateadd(day , t.id , '2008-1-1') <= '2008-1-10'
union all
select dateadd(day , t.id , '2008-1-5') id from # t where dateadd(day , t.id , '2008-1-5') <= '2008-1-12'
) m
group by id
having count(*) > 1
order by id
drop table #
/*
id
------------------------------------------------------
2008-01-05 00:00:00.000
2008-01-06 00:00:00.000
2008-01-07 00:00:00.000
2008-01-08 00:00:00.000
2008-01-09 00:00:00.000
2008-01-10 00:00:00.000
(所影响的行数为 6 行)
*/
WITH SeqNumber AS
(
SELECT TOP(360)
ID=ROW_NUMBER() OVER(ORDER BY o.object_id)-1
FROM sys.columns AS c
CROSS JOIN sys.objects AS o
),
RangeDate1 AS
(
SELECT
DATEADD(day,ID,'2008-1-1') AS dt
FROM SeqNumber
WHERE DATEADD(day,ID,'2008-1-1')<='2008-1-10'
),
RangeDate2 AS
(
SELECT
DATEADD(day,ID,'2008-1-5') AS dt
FROM SeqNumber
WHERE DATEADD(day,ID,'2008-1-5')<='2008-1-12'
)
SELECT
*
FROM RangeDate1 AS A
JOIN RangeDate2 AS B
ON A.dt=B.dt
/*
dt dt
----------------------- -----------------------
2008-01-05 00:00:00.000 2008-01-05 00:00:00.000
2008-01-06 00:00:00.000 2008-01-06 00:00:00.000
2008-01-07 00:00:00.000 2008-01-07 00:00:00.000
2008-01-08 00:00:00.000 2008-01-08 00:00:00.000
2008-01-09 00:00:00.000 2008-01-09 00:00:00.000
2008-01-10 00:00:00.000 2008-01-10 00:00:00.000
(6 行受影响)
*/