sql查询某时间段内生产进度,时间段包含时间段

时间:2022-10-09 17:10:24

比如 有两个订单
订单号,开始日期,结束日期
订单A,2009-12-03,2009-12-05
订单B,2009-12-01,2009-12-07

问题:如果我输入查询2009-12-03至2009-12-05的数据,那么订单B也要出来。因为订单比也是在此时间段内生产的订单。
所以,目前通过指定日期大于小于的方式好像不好实现。

望高手能帮忙出谋划策~

17 个解决方案

#1


你要的结果是什么样子的?

#2


感觉设计的不是很合理

#3


开始日期=2009-12-03 and 结束日期=2009-12-05 

#4


开始日期=2009-12-03 and 结束日期=2009-12-05 

#5


开始日期=2009-12-03 and 结束日期=2009-12-05 

#6


declare @s1 datetime ,@s2 datetime
set @s1='2009-12-03'
set @s2='2009-12-05'
select * from [TB] where 开始日期<=@s1 and 结束日期>=@s2



??

#7


create table tb(订单号 varchar(10) , 开始日期 datetime , 结束日期 datetime)
insert into tb values('订单A','2009-12-03','2009-12-05') 
insert into tb values('订单B','2009-12-01','2009-12-07')
go

declare @sdate datetime
declare @edate datetime
set @sdate = '2009-12-03'
set @edate = '2009-12-05'


select distinct m.* from tb m,
(--获取各时间的子查询
select 
    dateadd(dd,num,@sdate) dt
from 
    (select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
    dateadd(dd,num,@sdate)<=@edate
) n
where n.dt between m.开始日期 and m.结束日期

drop table tb 

/*
订单号        开始日期                                                   结束日期                                                   
---------- ------------------------------------------------------ ------------------------------------------------------ 
订单A        2009-12-03 00:00:00.000                                2009-12-05 00:00:00.000
订单B        2009-12-01 00:00:00.000                                2009-12-07 00:00:00.000

(所影响的行数为 2 行)
*/

#8


declare @startdt datetime
declare @enddt datetime
select @startdt='2009-12-03',@enddt='2009-12-05'
select * from tb
where 开始日期 between @startdt and @enddt
   or 结束日期 between @startdt and @enddt
   or @startdt between 开始日期 and 结束日期
   or @enddt   between 开始日期 and 结束日期

#9


加好多条件就行了

#10


--如果你不想定义变量,就带入具体的值进行查询.
create table tb(订单号 varchar(10) , 开始日期 datetime , 结束日期 datetime)
insert into tb values('订单A','2009-12-03','2009-12-05') 
insert into tb values('订单B','2009-12-01','2009-12-07')
go

select distinct m.* from tb m,
(--获取各时间的子查询
select 
    dateadd(dd,num,'2009-12-03') dt
from 
    (select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
    dateadd(dd,num,'2009-12-03')<='2009-12-05'
) n
where n.dt between m.开始日期 and m.结束日期

drop table tb 

/*
订单号        开始日期                                                   结束日期                                                   
---------- ------------------------------------------------------ ------------------------------------------------------ 
订单A        2009-12-03 00:00:00.000                                2009-12-05 00:00:00.000
订单B        2009-12-01 00:00:00.000                                2009-12-07 00:00:00.000

(所影响的行数为 2 行)
*/

#11


是生产排程的一个查询,要做甘特图。。

就是输入一个日期时间段,将时间段内所有正在生产的订单统计出来。

比如三个订单 
订单A,2009-12-03,2009-12-05   
订单B,2009-12-01,2009-12-07
订单C,2009-12-04,2010-01-09

我如果输入2009-12-01至2009-12-31.我的图上要显示所有本月进行的订单。
但是当前的语句设置为 结束日期>2009-12-01 and <2009-12-31 的话 订单c是不会出来的。但是它确实是在生产当中的

#12


哇高手好多,我一一测试一下,如果OK马上结贴。。

不知道我11楼的补充够不够清楚,不清楚之处还请见谅,偶是小菜

#13


dawugui 大哥真牛B.初步测试完全满足我期望的效果

#14


开始日期 between '2009-12-03' and '2009-12-05'or
          结束日期 between '2009-12-03' and '2009-12-05'

#15


开始日期 between '2009-12-03' and '2009-12-05'or
          结束日期 between '2009-12-03' and '2009-12-05'

#16


wufeng4552 大哥的代码也完全可以,而且我基本能看懂。

dawugui 的我要消化一下,高人啊 。哈哈

结贴了

#17


对不起啊 wufeng4552  结贴的时候点错了。请问该怎么重新分配分啊

#1


你要的结果是什么样子的?

#2


感觉设计的不是很合理

#3


开始日期=2009-12-03 and 结束日期=2009-12-05 

#4


开始日期=2009-12-03 and 结束日期=2009-12-05 

#5


开始日期=2009-12-03 and 结束日期=2009-12-05 

#6


declare @s1 datetime ,@s2 datetime
set @s1='2009-12-03'
set @s2='2009-12-05'
select * from [TB] where 开始日期<=@s1 and 结束日期>=@s2



??

#7


create table tb(订单号 varchar(10) , 开始日期 datetime , 结束日期 datetime)
insert into tb values('订单A','2009-12-03','2009-12-05') 
insert into tb values('订单B','2009-12-01','2009-12-07')
go

declare @sdate datetime
declare @edate datetime
set @sdate = '2009-12-03'
set @edate = '2009-12-05'


select distinct m.* from tb m,
(--获取各时间的子查询
select 
    dateadd(dd,num,@sdate) dt
from 
    (select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
    dateadd(dd,num,@sdate)<=@edate
) n
where n.dt between m.开始日期 and m.结束日期

drop table tb 

/*
订单号        开始日期                                                   结束日期                                                   
---------- ------------------------------------------------------ ------------------------------------------------------ 
订单A        2009-12-03 00:00:00.000                                2009-12-05 00:00:00.000
订单B        2009-12-01 00:00:00.000                                2009-12-07 00:00:00.000

(所影响的行数为 2 行)
*/

#8


declare @startdt datetime
declare @enddt datetime
select @startdt='2009-12-03',@enddt='2009-12-05'
select * from tb
where 开始日期 between @startdt and @enddt
   or 结束日期 between @startdt and @enddt
   or @startdt between 开始日期 and 结束日期
   or @enddt   between 开始日期 and 结束日期

#9


加好多条件就行了

#10


--如果你不想定义变量,就带入具体的值进行查询.
create table tb(订单号 varchar(10) , 开始日期 datetime , 结束日期 datetime)
insert into tb values('订单A','2009-12-03','2009-12-05') 
insert into tb values('订单B','2009-12-01','2009-12-07')
go

select distinct m.* from tb m,
(--获取各时间的子查询
select 
    dateadd(dd,num,'2009-12-03') dt
from 
    (select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
    dateadd(dd,num,'2009-12-03')<='2009-12-05'
) n
where n.dt between m.开始日期 and m.结束日期

drop table tb 

/*
订单号        开始日期                                                   结束日期                                                   
---------- ------------------------------------------------------ ------------------------------------------------------ 
订单A        2009-12-03 00:00:00.000                                2009-12-05 00:00:00.000
订单B        2009-12-01 00:00:00.000                                2009-12-07 00:00:00.000

(所影响的行数为 2 行)
*/

#11


是生产排程的一个查询,要做甘特图。。

就是输入一个日期时间段,将时间段内所有正在生产的订单统计出来。

比如三个订单 
订单A,2009-12-03,2009-12-05   
订单B,2009-12-01,2009-12-07
订单C,2009-12-04,2010-01-09

我如果输入2009-12-01至2009-12-31.我的图上要显示所有本月进行的订单。
但是当前的语句设置为 结束日期>2009-12-01 and <2009-12-31 的话 订单c是不会出来的。但是它确实是在生产当中的

#12


哇高手好多,我一一测试一下,如果OK马上结贴。。

不知道我11楼的补充够不够清楚,不清楚之处还请见谅,偶是小菜

#13


dawugui 大哥真牛B.初步测试完全满足我期望的效果

#14


开始日期 between '2009-12-03' and '2009-12-05'or
          结束日期 between '2009-12-03' and '2009-12-05'

#15


开始日期 between '2009-12-03' and '2009-12-05'or
          结束日期 between '2009-12-03' and '2009-12-05'

#16


wufeng4552 大哥的代码也完全可以,而且我基本能看懂。

dawugui 的我要消化一下,高人啊 。哈哈

结贴了

#17


对不起啊 wufeng4552  结贴的时候点错了。请问该怎么重新分配分啊