根据日期选择查询

Mah*_* KP 4 sql-server select

我们有一个表来存储事件。

表有一个像

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 个视图来显示事件 -

  1. 月份视图-这显示所有事件在一个月

  2. 显示当天事件的日视图

假设我有一个开始日期为 2012 年 10 月 23 日和结束日期为 2012 年 10 月 27 日的事件。

而我通过@StartDate as 24 Oct 2012@EndDate as 25 OCt 2012

根据上面的查询,它在Month 视图中工作。但它在白天视图中不起作用。

任何人都可以帮我修改查询以在这两种情况下工作

Han*_*non 7

您只需要稍微不同地考虑日期范围。如果开始日期在您的报告期结束之前,并且结束日期在您的报告期开始之后,则事件属于您的给定范围:

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语句返回此示例中的所有事件。