sql语句 sql 查询符合条件的上面一条

时间:2022-06-11 01:02:02
sql 查询结果要查询工作日
 如果条件是-1 就是当前日期的前一个工作日
 如果条件是-2 就是当前日期的前的第二个作日
数据库字段
日期  
状态   0:节假日; 1:工作日; 

13 个解决方案

#1


有数据没?
给些测试数据啥的!

#2


是这样吗:
select *
from 表
where DATEDIFF(day,getdate(),你的日期字段) = -1 -- 前1天

select *
from 表
where DATEDIFF(day,getdate(),你的日期字段) = -2 -- 前2天

#3


2楼少了对状态的判断

#4


2014/1/1 0
2014/1/2 1
2014/1/3 1
2014/1/4 0
2014/1/5 0
2014/1/6 1
2014/1/7 1
2014/1/8 1
2014/1/9 1
2014/1/10 1

#5


还是不对啊,求各位大神帮忙啊

#6



--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],convert(varchar(10),max(b.[日期]),120) as [前一个工作日]
 from a left join 
(
select * from a where  [状态] =1
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]


日期         状态          前一个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           2014-01-02
2014-01-04 0           2014-01-03
2014-01-05 0           2014-01-03
2014-01-06 1           2014-01-03
2014-01-07 1           2014-01-06
2014-01-08 1           2014-01-07
2014-01-09 1           2014-01-08
2014-01-10 1           2014-01-09

#7


这个只能查前一个工作日,按照 -1 -2 好像不行吧

#8


引用 7 楼 wrb64113624 的回复:
这个只能查前一个工作日,按照 -1 -2 好像不行吧


你的意思是,还得考虑状态,是否是工作日?

#9


还有一个判断条件
如果是-1 就是当前日期的前一个工作日
如果是-2 就是当前日期的前面第二个工作日


#10



--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],
convert(varchar(10),max(b.[日期1]),120) as [前两个工作日]
 from a left join 
(
select a.[日期],max(b.[日期]) as [日期1] from a a left join a b
on a.[日期]>b.[日期]
where  a.[状态] =1 and b.[状态] =1 
group by a.[日期]
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]




日期         状态          前两个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           NULL
2014-01-04 0           2014-01-02
2014-01-05 0           2014-01-02
2014-01-06 1           2014-01-02
2014-01-07 1           2014-01-03
2014-01-08 1           2014-01-06
2014-01-09 1           2014-01-07
2014-01-10 1           2014-01-08

#11


这样的话   -3  -4 怎么办呢。。。。。头好大啊,谢谢各位帮忙

#12


引用 11 楼 wrb64113624 的回复:
这样的话   -3  -4 怎么办呢。。。。。头好大啊,谢谢各位帮忙


--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 
--建立b表
select *,row_number() over(order by [日期]) as rn  into b from a where [状态] =1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],
convert(varchar(10),max(b.[日期1]),120) as [前N个工作日]
 from a left join 
(
select a.[日期],b.[日期]as [日期1]  from 
(
select a.[日期],max(b.rn) as rn from b a left join b b 
on a.rn-1 >b.rn-2--'-1是参数'
group by a.[日期]
)a left join b b on a.rn=b.rn
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]

整个活的~~动态的!
日期         状态          前N个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           2014-01-02
2014-01-04 0           2014-01-03
2014-01-05 0           2014-01-03
2014-01-06 1           2014-01-03
2014-01-07 1           2014-01-06
2014-01-08 1           2014-01-07
2014-01-09 1           2014-01-08
2014-01-10 1           2014-01-09

#13


谢谢各位的帮助确认晚了!!!

#1


有数据没?
给些测试数据啥的!

#2


是这样吗:
select *
from 表
where DATEDIFF(day,getdate(),你的日期字段) = -1 -- 前1天

select *
from 表
where DATEDIFF(day,getdate(),你的日期字段) = -2 -- 前2天

#3


2楼少了对状态的判断

#4


2014/1/1 0
2014/1/2 1
2014/1/3 1
2014/1/4 0
2014/1/5 0
2014/1/6 1
2014/1/7 1
2014/1/8 1
2014/1/9 1
2014/1/10 1

#5


还是不对啊,求各位大神帮忙啊

#6



--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],convert(varchar(10),max(b.[日期]),120) as [前一个工作日]
 from a left join 
(
select * from a where  [状态] =1
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]


日期         状态          前一个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           2014-01-02
2014-01-04 0           2014-01-03
2014-01-05 0           2014-01-03
2014-01-06 1           2014-01-03
2014-01-07 1           2014-01-06
2014-01-08 1           2014-01-07
2014-01-09 1           2014-01-08
2014-01-10 1           2014-01-09

#7


这个只能查前一个工作日,按照 -1 -2 好像不行吧

#8


引用 7 楼 wrb64113624 的回复:
这个只能查前一个工作日,按照 -1 -2 好像不行吧


你的意思是,还得考虑状态,是否是工作日?

#9


还有一个判断条件
如果是-1 就是当前日期的前一个工作日
如果是-2 就是当前日期的前面第二个工作日


#10



--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],
convert(varchar(10),max(b.[日期1]),120) as [前两个工作日]
 from a left join 
(
select a.[日期],max(b.[日期]) as [日期1] from a a left join a b
on a.[日期]>b.[日期]
where  a.[状态] =1 and b.[状态] =1 
group by a.[日期]
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]




日期         状态          前两个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           NULL
2014-01-04 0           2014-01-02
2014-01-05 0           2014-01-02
2014-01-06 1           2014-01-02
2014-01-07 1           2014-01-03
2014-01-08 1           2014-01-06
2014-01-09 1           2014-01-07
2014-01-10 1           2014-01-08

#11


这样的话   -3  -4 怎么办呢。。。。。头好大啊,谢谢各位帮忙

#12


引用 11 楼 wrb64113624 的回复:
这样的话   -3  -4 怎么办呢。。。。。头好大啊,谢谢各位帮忙


--> 测试数据:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a](  [日期] datetime, [状态] int)
insert [a]
select'2014/1/1',0 union all
select'2014/1/2',1 union all
select'2014/1/3',1 union all
select'2014/1/4',0 union all
select'2014/1/5',0 union all
select'2014/1/6',1 union all
select'2014/1/7',1 union all
select'2014/1/8',1 union all
select'2014/1/9',1 union all
select'2014/1/10',1 
--建立b表
select *,row_number() over(order by [日期]) as rn  into b from a where [状态] =1 

select convert(varchar(10),a.[日期],120) as [日期] ,a.[状态],
convert(varchar(10),max(b.[日期1]),120) as [前N个工作日]
 from a left join 
(
select a.[日期],b.[日期]as [日期1]  from 
(
select a.[日期],max(b.rn) as rn from b a left join b b 
on a.rn-1 >b.rn-2--'-1是参数'
group by a.[日期]
)a left join b b on a.rn=b.rn
) b on a.[日期]>b.[日期]
group by a.[日期],a.[状态]
order by a.[日期]

整个活的~~动态的!
日期         状态          前N个工作日
---------- ----------- ----------
2014-01-01 0           NULL
2014-01-02 1           NULL
2014-01-03 1           2014-01-02
2014-01-04 0           2014-01-03
2014-01-05 0           2014-01-03
2014-01-06 1           2014-01-03
2014-01-07 1           2014-01-06
2014-01-08 1           2014-01-07
2014-01-09 1           2014-01-08
2014-01-10 1           2014-01-09

#13


谢谢各位的帮助确认晚了!!!