我们有一个表来存储事件。
表有一个像
EventID INT Primary Key
EventName NVARCHAR(100)
StartDate Datetime
EndDate Datetime
Run Code Online (Sandbox Code Playgroud)
所以在前端我们要根据开始时间和结束时间显示事件。从前端,我们将 StartDate 和 EndDate 作为参数传递以获取值。
到目前为止,我们已经采取了像
Select * from tbl_Events
where ((startDate BETWEEN @start AND @end) OR (EndDate BETWEEN @start AND @end))
Run Code Online (Sandbox Code Playgroud)
我们有 2 个视图来显示事件 -
一月份视图-这显示所有事件在一个月
显示当天事件的日视图
假设我有一个开始日期为 2012 年 10 月 23 日和结束日期为 2012 年 10 月 27 日的事件。
而我通过@StartDate as 24 Oct 2012和@EndDate as 25 OCt 2012
根据上面的查询,它在Month 视图中工作。但它在白天视图中不起作用。
任何人都可以帮我修改查询以在这两种情况下工作
您只需要稍微不同地考虑日期范围。如果开始日期在您的报告期结束之前,并且结束日期在您的报告期开始之后,则事件属于您的给定范围:
Select * from tbl_Events
where StartDate <= @end
AND EndDate >= @start;
Run Code Online (Sandbox Code Playgroud)
例如:
CREATE TABLE MyTestDates
(
MyTestDateID INT NOT NULL PRIMARY KEY CLUSTERED CONSTRAINT PK_MyTestDates IDENTITY(1,1)
, StartDate DATETIME
, EndDate DATETIME
, EventName NVARCHAR(255)
);
INSERT INTO MyTestDates (StartDate, EndDate, EventName)
VALUES ('2012-01-27', '2012-01-30', 'Test Event 1');
INSERT INTO MyTestDates (StartDate, EndDate, EventName)
VALUES ('2012-01-27', '2012-02-28', 'Test Event 2');
INSERT INTO MyTestDates (StartDate, EndDate, EventName)
VALUES ('2011-01-01', '2012-03-22', 'Test Event 3');
DECLARE @FromDate DATETIME;
DECLARE @ToDate DATETIME;
SET @FromDate = '2012-01-01';
SET @ToDate = '2012-02-01'
SELECT @FromDate AS ReportFrom, @ToDate AS ReportTo, *
FROM MyTestDates
WHERE StartDate <= @ToDate
AND EndDate >= @FromDate;
SET @FromDate = '2012-01-28';
SET @ToDate = '2012-01-29'
SELECT @FromDate AS ReportFrom, @ToDate AS ReportTo, *
FROM MyTestDates
WHERE StartDate <= @ToDate
AND EndDate >= @FromDate;
SET @FromDate = '2010-01-01';
SET @ToDate = '2012-05-15'
SELECT @FromDate AS ReportFrom, @ToDate AS ReportTo, *
FROM MyTestDates
WHERE StartDate <= @ToDate
AND EndDate >= @FromDate;
DROP TABLE MyTestDates;
Run Code Online (Sandbox Code Playgroud)
这三个SELECT语句返回此示例中的所有事件。
| 归档时间: |
|
| 查看次数: |
4611 次 |
| 最近记录: |