34,594
社区成员
发帖
与我相关
我的任务
分享
--楼主描述有错,不是求最接近的日期,而是求小于给定日期的最大日期.前者如上所写.后者如下:
create table tb(日期 datetime, 字段1 varchar(10), 字段2 int)
insert into tb values('2007-10-01', 'a', 1 )
insert into tb values('2007-12-10', 'r', 3 )
insert into tb values('2007-12-20', 'r', 2 )
insert into tb values('2007-12-10', 'z', 7 )
insert into tb values('2007-12-16', 'z', 6 )
insert into tb values('2007-12-26', 'z', 8 )
go
declare @dt as datetime
set @dt = '2007-12-17'
select a.* from tb a,
(
select max(日期) 日期,字段1 from tb where 日期 < @dt group by 字段1
) t
where a.字段1 = t.字段1 and a.日期 = t.日期
order by a.字段1
/*
日期 字段1 字段2
----------------------- ---------- -----------
2007-10-01 00:00:00.000 a 1
2007-12-10 00:00:00.000 r 3
2007-12-16 00:00:00.000 z 6
(3 行受影响)
*/
set @dt = '2007-12-30'
select a.* from tb a,
(
select max(日期) 日期,字段1 from tb where 日期 < @dt group by 字段1
) t
where a.字段1 = t.字段1 and a.日期 = t.日期
order by a.字段1
/*
日期 字段1 字段2
----------------------- ---------- -----------
2007-10-01 00:00:00.000 a 1
2007-12-20 00:00:00.000 r 2
2007-12-26 00:00:00.000 z 8
(3 行受影响)
*/
drop table tb
declare @t table(日期 datetime, 字段1 varchar(2),字段2 varchar(2))
insert @t select '2007-10-01','a','1'
insert @t select '2007-12-10','r','3'
insert @t select '2007-12-20','r','2'
insert @t select '2007-12-10','z','7'
insert @t select '2007-12-16','z','6'
insert @t select '2007-12-26','z','8'
select *
from @t a
where not exists(select 1 from @t where a.字段1 = 字段1 and a.日期 < 日期 and 日期 < '2007-12-17')
and 日期 < '2007-12-17'
select *
from @t a
where not exists(select 1 from @t where a.字段1 = 字段1 and a.日期 < 日期 and 日期 < '2007-12-30' )
and 日期 < '2007-12-30'
/*
日期 字段1 字段2
------------------------------------------------------ ---- ----
2007-10-01 00:00:00.000 a 1
2007-12-10 00:00:00.000 r 3
2007-12-16 00:00:00.000 z 6
(所影响的行数为 3 行)
日期 字段1 字段2
------------------------------------------------------ ---- ----
2007-10-01 00:00:00.000 a 1
2007-12-20 00:00:00.000 r 2
2007-12-26 00:00:00.000 z 8
(所影响的行数为 3 行)
*/
create table tb(日期 datetime, 字段1 varchar(10), 字段2 int)
insert into tb values('2007-10-01', 'a', 1 )
insert into tb values('2007-12-10', 'r', 3 )
insert into tb values('2007-12-20', 'r', 2 )
insert into tb values('2007-12-10', 'z', 7 )
insert into tb values('2007-12-16', 'z', 6 )
insert into tb values('2007-12-26', 'z', 8 )
go
declare @dt as datetime
set @dt = '2007-12-17'
select a.* from tb a,
(
select 字段1 , min(时间差) 时间差 from
(
select abs(datediff(day,@dt,日期)) 时间差,日期,字段1 from tb
) t group by 字段1
) m
where a.字段1 = m.字段1 and abs(datediff(day,@dt,a.日期)) = m.时间差
/*
日期 字段1 字段2
----------------------- ---------- -----------
2007-10-01 00:00:00.000 a 1
2007-12-20 00:00:00.000 r 2
2007-12-16 00:00:00.000 z 6
(3 行受影响)
*/
set @dt = '2007-12-30'
select a.* from tb a,
(
select 字段1 , min(时间差) 时间差 from
(
select abs(datediff(day,@dt,日期)) 时间差,日期,字段1 from tb
) t group by 字段1
) m
where a.字段1 = m.字段1 and abs(datediff(day,@dt,a.日期)) = m.时间差
/*
日期 字段1 字段2
----------------------- ---------- -----------
2007-10-01 00:00:00.000 a 1
2007-12-20 00:00:00.000 r 2
2007-12-26 00:00:00.000 z 8
(3 行受影响)
*/
drop table tb
select a.* from tb a,
(
select 字段1 , min(时间差) 时间差 from
(
select abs(datediff(day,@dt,日期)) 时间差,日期,字段1 from tb
) t group by 字段1
) m
where a.字段1 = m.字段1 and abs(datediff(day,@dt,a.日期)) = b.时间差
select *
from tablename a
where not exists(select 1 from tablename where a.字段1 = 字段1 and a.日期 < 日期)
and 日期 < '2007-12-17'
select *
from tablename a
where not exists(select 1 from tablename where a.字段1 = 字段1 and a.日期 < 日期)
and 日期 < '2007-12-30'