数据查询之参数区段落入数据区段查询

有一个场景,某一事件发生时间为7:00,结束时间为8:10。现在输入参数开始时间为7:00,结束时间为8:00,要求该条数据也能显示。

这时普通的开始时间大于等于参数开始时间、结束时间小于等于参数结束时间已不能满足要求。

解决方法为:开始时间小于等于参数结束时间、结束时间大于等于参数开始时间。


CREATE TABLE [dbo].[RANGE](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[START_DATE] [date] NOT NULL,
	[END_DATE] [date] NULL
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[RANGE] ON 

INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (17, CAST(N'2010-01-01' AS Date), CAST(N'2010-01-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (18, CAST(N'2010-02-01' AS Date), CAST(N'2010-02-28' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (19, CAST(N'2010-03-01' AS Date), CAST(N'2010-03-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (20, CAST(N'2010-04-01' AS Date), CAST(N'2010-04-30' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (21, CAST(N'2010-05-01' AS Date), CAST(N'2010-05-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (22, CAST(N'2010-06-01' AS Date), CAST(N'2010-06-30' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (23, CAST(N'2010-07-01' AS Date), CAST(N'2010-07-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (24, CAST(N'2010-08-01' AS Date), CAST(N'2010-08-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (25, CAST(N'2010-09-01' AS Date), CAST(N'2010-09-30' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (26, CAST(N'2010-10-01' AS Date), CAST(N'2010-10-31' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (27, CAST(N'2010-11-01' AS Date), CAST(N'2010-11-30' AS Date))
INSERT [dbo].[RANGE] ([ID], [START_DATE], [END_DATE]) VALUES (28, CAST(N'2010-12-01' AS Date), CAST(N'2010-12-31' AS Date))
SET IDENTITY_INSERT [dbo].[RANGE] OFF
例如现在要求查询出从 2010-01-02 到 2010-05-30 的数据
写法:
SELECT TOP (1000) [ID]
      ,[START_DATE]
      ,[END_DATE]
  FROM [dbo].[RANGE] A 
  WHERE  A.START_DATE <= '2010-05-30'
   AND    A.END_DATE  >= '2010-01-02' 

逻辑:     可将时间分为三段     2010-01-02之前     2010-01-02 ----2010-05-30      2010-05-30 之后


希望事件时间段落在2010-01-02 ----2010-05-30 的反面即是 (事件结束时间小于 2010-01-02  或者  事件开始时间大于2010-05-30)


则 NOT(事件结束时间小于 2010-01-02  或者  事件开始时间大于2010-05-30)     即为 事件时间段落在2010-01-02 ----2010-05-30


即       事件结束时间大于等于2010-01-02   AND 事件开始时间小于等于2010-05-30

备注:这种写法有一个问题,即输入的开始时间参数可能会大于结束时间参数。还需在语句后面加上:   AND 开始时间参数<= 结束时间参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值