很简单的问题,求时候段的!非常急!

fante2007 2007-08-30 01:21:00
from_date end_date
----------------------- -------------------
2007-05-01 00:00:00 2007-06-06 00:00:00
2007-10-01 00:00:00 2007-10-10 00:00:00
表的结构如上,
现在我想写一存储过程,两个参数,一个开始时间,一个结束时间,也就是我想用这个存储过程判断一个时间段是否在这个表里的时间段内,如果在返回1,如果不在返回0,谢谢大家了,
...全文
465 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limpire 2007-08-30
  • 打赏
  • 举报
回复
/*
如果我给的参数是 '2007-05-06','2007-10-09' 这两个时间的时间段就和表里交叉了,返回1
如果我给的参数是‘2000-05-05’,‘2000-06-07’这样就返回0
如果我给的参数是‘2007-06-07’,‘2000-07-10’这样也返回0
……
就是说我现在有个时间段,这个时间段既不能在表内的时间段内,也不能和表内的时间段交叉,怎么半?
*/
---------------------------------

/*
这样办:要实现这样的功能,数据表需要一个连续唯一的ID。
*/

set nocount on
--原始数据:@Original 没有连续唯一的列,不能通过这个表查询。
declare @Original table (Start datetime, Stop datetime)
insert @Original
select '2007-10-01 00:00:00','2007-10-10 00:00:00' union all
select '2007-05-01 00:00:00','2007-06-06 00:00:00'

--测试数据:创建有自增列的测试表,将通过这个表查询。
declare @Test table (ID int identity(1,1), Start datetime, Stop datetime)
insert @Test(Start, Stop) select * from @Original order by Start -- order by Start 很关键,一定要!
set nocount off

declare @Start datetime, @Stop datetime

select @Start = '2007-05-06', @Stop = '2007-10-09'
if exists (select 1 from @Test where Start>=@Start and Stop <=@Stop) print 1
else if exists (select 1 from @Test a left join @Test b on a.ID = b.ID + 1 where b.Stop>=@Start and a.Start<=@Stop) print 1
else print 0
/*
print 1
*/

select @Start = '2000-05-05', @Stop = '2000-06-07'
if exists (select 1 from @Test where Start>=@Start and Stop <=@Stop) print 1
else if exists (select 1 from @Test a left join @Test b on a.ID = b.ID + 1 where b.Stop>=@Start and a.Start<=@Stop) print 1
else print 0
/*
print 0
*/

select @Start = '2007-06-07', @Stop = '2000-07-10'
if exists (select 1 from @Test where Start>=@Start and Stop <=@Stop) print 1
else if exists (select 1 from @Test a left join @Test b on a.ID = b.ID + 1 where b.Stop>=@Start and a.Start<=@Stop) print 1
else print 0
/*
print 0
*/
fengming2222 2007-08-30
  • 打赏
  • 举报
回复
先建一个自定义函数
CREATE FUNCTION pp (@dt1 datetime, @dt2 datetime, @dt3 datetime, @dt4 datetime)
RETURNS int AS
BEGIN
declare @a int
if (@dt3>=@dt1 and @dt4<=@dt2 )
set @a= 1
else
set @a=0
return @a

END

建表 tt 并插入记录
create table tt (_date1 datetime,_date2 datetime)
insert into tt values('2007-05-01','2007-10-01')
insert into tt values('2007-10-01,'2007-12-01')

测试
select *,dbo.pp(_date1,_date2,'2007-05-02','2007-07-09') as result from tt

结果------
_date1 _date2 reslt
2007-05-01 00:00:00.000 2007-10-01 00:00:00.000 1
2007-10-01 00:00:00.000 2007-12-01 00:00:00.000 0
wgzaaa 2007-08-30
  • 打赏
  • 举报
回复
测试数据
create table 表1(from_date datetime,end_date datetime)
insert 表1 select
'2007-05-01 00:00:00', '2007-06-06 00:00:00' insert 表1 select
'2007-10-01 00:00:00', '2007-10-10 00:00:00'
fante2007 2007-08-30
  • 打赏
  • 举报
回复
就是说我现在有个时间段,这个时间段既不能在表内的时间段内,也不能和表内的时间段交叉,怎么半?
wgzaaa 2007-08-30
  • 打赏
  • 举报
回复
create proc pro_aaa @d1 datetime,@d2 datetime,@i int output as
set @i=0
select @i=1 where exists(select 0 from 表1 where @d1 between from_date and end_date) and exists(select 0 from 表1 where @d2 between from_date and end_date)
---------------------
declare @ii int
exec pro_aaa '2007-06-07','2000-07-10',@ii output
select @ii
wgzaaa 2007-08-30
  • 打赏
  • 举报
回复
时间段内的概念怕是难弄清
fante2007 2007-08-30
  • 打赏
  • 举报
回复
如果我给的参数是 '2007-05-06','2007-10-09' 这两个时间的时间段就和表里交叉了,返回1
如果我给的参数是‘2000-05-05’,‘2000-06-07’这样就返回0
如果我给的参数是‘2007-06-07’,‘2000-07-10’这样也返回0,
明白没有呀!? 兄弟门,救救我!
fante2007 2007-08-30
  • 打赏
  • 举报
回复
如果我给的参数是 '2007-05-06','2007-10-09' 这两个时间的时间段就和表里交叉了,返回1
如果我给的参数是‘2000-05-05’,‘2000-06-07’这样就返回0
如果我给的参数是‘2007-06-07’,‘2000-07-10’这样也返回0,
明白没有呀!? 兄弟门,救救我!
fante2007 2007-08-30
  • 打赏
  • 举报
回复
如果我给的参数是 '2007-05-06','2007-10-09' 这两个时间的时间段就和表里交叉了,返回1
如果我给的参数是‘2000-05-05’,‘2000-06-07’这样就返回0
如果我给的参数是‘2007-06-07’,‘2000-07-10’这样也返回0,
明白没有呀!? 兄弟门,救救我!
wangliqiu2008 2007-08-30
  • 打赏
  • 举报
回复
应该是类似 上班打卡的程序吧 只要两个时间点都在之间就可以了吧
OracleRoob 2007-08-30
  • 打赏
  • 举报
回复
--这不是两个参数?

create proc p_test(@dt1 datetime, @dt2 datetime)
as


if exists (select 1 from 表名 where (@dt1 between 开始日期 and 结束日期) and (@dt2 between 开始日期 and 结束日期))
select 1
else
select 0
go

Limpire 2007-08-30
  • 打赏
  • 举报
回复
declare @Date1 datetime,@Date2 datetime,@Tmp datetime

set @Date1 = ...
set @Date2 = ...

if @Date1 > @Date2 select @Tmp = @Date1, @Date1 = @Date2, @Date2 = @Tmp

if exists (select 1 from TAB where from_date =< @Date1 and end_date >= @Date2)
return(1)
else
return(0)
fengming2222 2007-08-30
  • 打赏
  • 举报
回复
create proc p_test(@dt1 datetime, @dt2 datetime,@result int out) as
begin
declare @_date datetime
declare @a int --返回的值
_date='2007-10-10 00:00:00'--你所要判断的时间值
if _date>=@dt1 and _date<=@dt2
@a=1
else
@a=0
return @a
end
fante2007 2007-08-30
  • 打赏
  • 举报
回复
是一个时间段,是两个参数
fante2007 2007-08-30
  • 打赏
  • 举报
回复
是一个时间段,是两个参数
fante2007 2007-08-30
  • 打赏
  • 举报
回复
是一个时间段,是两个参数
chuifengde 2007-08-30
  • 打赏
  • 举报
回复
create proc test
@Sdate smalldatetime,
@Edate smalldatetime
as
if exists(select 1 from [Table] where datediff(day,from_date,@Sdate)>=0 and datediff(day,@Edate,end_date)>=0)
return 1
else
return 0
OracleRoob 2007-08-30
  • 打赏
  • 举报
回复

create proc p_test(@dt1 datetime, @dt2 datetime)
as


if exists (select 1 from 表名 where (@dt1 between 开始日期 and 结束日期) and (@dt2 between 开始日期 and 结束日期))
select 1
else
select 0
go
Limpire 2007-08-30
  • 打赏
  • 举报
回复
declare @Date datetime
set @Date = getdate()
if exists (select 1 from TAB where from_date =< @Date and end_date >= @Date)
return(1)
else
return(0)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧