日期:2014-05-18  浏览次数:20721 次

SQLSERVER中求两个日期段间的数据记录
假如有个表workers ,有很多字段,其中两个字段是begindate 和enddate,用来表示某个工人开始工作的日期和结束工作的日期。

workername begindate enddate
张三 2012-6-1 2012-6-12
李四 2012-6-5 2012-6-20
王五 2012-6-9 2012-6-10

================================================

假如查询时,提供两个文本框,第一个框输入 2012-6-1 ,第二个框输入2012-6-8后,我实际想要得到的记录是:

张三和李四,两条记录的内容。

要求是: 只要 在搜索的两个日期间的(包括两个搜索日期)的,或者 begindate和enddate间有一个等于这两个搜索日期间的数据记录存在的话,就显示出来。[b]如何写语句??
用程序的方式,能实现。但是,现在想简化点,通过SQL语句的方式能实现.[/b]
假如第一个框的id= d1,第二个框的id=d2

===================================================
谢谢!




------解决方案--------------------
SQL code

--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test](
[workername] varchar(4),
[begindate] date,
[enddate] date
)
go
insert [test]
select '张三','2012-6-1','2012-6-12' union all
select '李四','2012-6-5','2012-6-20' union all
select '王五','2012-6-9','2012-6-10'
go


declare @d1 date
set @d1='2012-6-1'
declare @d2 date
set @d2='2012-6-8'
select * 
from test 
where [begindate] between @d1 and @d2
or [enddate] between @d1 and  @d2
or [begindate]<@d1 and @d2>[enddate]--若果需要的是两个区间有交集就绪把这个加上,不需要就去掉

/*
workername    begindate    enddate
------------------------------------
张三    2012-06-01    2012-06-12
李四    2012-06-05    2012-06-20
*/

------解决方案--------------------
SQL code

--更正一下

--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test](
[workername] varchar(4),
[begindate] date,
[enddate] date
)
go
insert [test]
select '张三','2012-6-1','2012-6-12' union all
select '李四','2012-6-5','2012-6-20' union all
select '王五','2012-6-9','2012-6-10'
go


declare @d1 date
set @d1='2012-6-1'
declare @d2 date
set @d2='2012-6-8'
select * 
from test 
where [begindate] between @d1 and @d2
or [enddate] between @d1 and  @d2
or ([begindate]<@d1 and @d2>[enddate])--若果需要的是两个区间有交集就绪把这个加上,不需要就去掉

/*
workername    begindate    enddate
------------------------------------
张三    2012-06-01    2012-06-12
李四    2012-06-05    2012-06-20
*/

------解决方案--------------------
select * from test
where '2012-6-1' between [begindate] and [enddate]
or '2012-6-8' between [begindate] and [enddate]
------解决方案--------------------
探讨

用between?