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

求时间范围交集的sql怎么写?
例如有一个表 t1 ,格式如下,thedate是生产日期,假设每种物品保质期都是 3个月,例如雪莲保质期应该是一直到 2012-06-08.
如果任意输入一段时间范围,例如我现在输入 4.27-5.26,那么我希望能够列出当前在 4.27-5.26所有尚在保质期之内的物品清单,sql 应该怎么写?

select * from t1 

typeName theDate
哈密瓜 2012-03-01
雪莲 2012-03-08
西瓜 2012-03-13

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

--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test]([typeName] varchar(6),[theDate] datetime)
insert [test]
select '哈密瓜','2012-03-01' union all
select '雪莲','2012-03-08' union all
select '西瓜','2012-03-13'


select [typeName],[theDate] from(
select *,
DATEADD(mm,3,[theDate]) as enddate from test)t
where enddate>='2012-05-26' and [theDate] between '2012-04-27' and '2012-05-26'

------解决方案--------------------
你给的条件中,其实5月26号就根本没有用了,只要保质期大于4月27号就都属于这个范围内的。。。
SQL code

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')
BEGIN
    DROP TABLE tba
END
GO
CREATE TABLE tba
(
    typeName VARCHAR(100),
    theDate VARCHAR(100)
)

INSERT INTO tba
SELECT '哈密瓜', '2012-03-01' UNION
SELECT '雪莲', '2012-03-08' UNION
SELECT '西瓜', '2012-03-13' UNION
SELECT '美人瓜','2012-4-25'

--4.27-5.26

SELECT * FROM tba
WHERE DATEADD(MONTH,3,theDate) > '2012-04-27'

typeName    theDate
哈密瓜    2012-03-01
美人瓜    2012-4-25
西瓜    2012-03-13
雪莲    2012-03-08