Sql server 2008 比较日期范围

Sql server 2008 比较日期范围,sql-server-2008,datetime,Sql Server 2008,Datetime,数据: 对于以上数据,我有两个活动活动在一个接一个地运行。 对于给定的日期(rundate),我需要从@DatesTable中选择一个适用@rundate的有效活动 基本上,要查看的结束日期取决于下一个活动的开始日期,并确定@rundate对哪个活动有效并返回该结果 如果没有返回结果,则需要返回上一个活动。如果所有内容都声明为date,而不是datetime,则您将有一个更轻松的时间(无CAST)。无论如何,试一下: DECLARE @rundate datetime = GETDATE()

数据:

对于以上数据,我有两个活动活动在一个接一个地运行。 对于给定的日期(rundate),我需要从@DatesTable中选择一个适用@rundate的有效活动

基本上,要查看的结束日期取决于下一个活动的开始日期,并确定@rundate对哪个活动有效并返回该结果


如果没有返回结果,则需要返回上一个活动。

如果所有内容都声明为
date
,而不是
datetime
,则您将有一个更轻松的时间(无
CAST
)。无论如何,试一下:

DECLARE @rundate datetime = GETDATE()

DECLARE @DatesTable TABLE (name varchar(200),STARTDATE datetime,ENDDATE datetime)
INSERT INTO @DatesTable VALUES('campaign1',GETDATE(),GETDATE()+10)

INSERT INTO @DatesTable
VALUES('campaign2',GETDATE()+11,GETDATE()+13)
;具有
cte AS
(
选择名称、开始日期、结束日期、,
rn=行号()结束(订单按结束日期描述)
来自@DatesTable

WHERE CAST(STARTDATE AS date)您的所有列都是
datetime
。我们是否应该忽略时间组件?是-如果您需要知道表@DatesTable中记录的活动是否在特定日期(放在@rundate变量中)运行,则时间始终为00:00:00.000?
;WITH
    cte AS
    (
        SELECT  name, STARTDATE, ENDDATE,
                rn = ROW_NUMBER() OVER (ORDER BY ENDDATE DESC) 
        FROM    @DatesTable
        WHERE   CAST(STARTDATE AS date) <= CAST(@rundate AS date)
    )

SELECT  *
FROM    cte
WHERE   rn = 1