存储过程 - 开始和结束日期,查看今天的日期

时间:2016-01-12 22:34:43

标签: sql-server date stored-procedures

我有一个包含此条目的表格:

StartDate     |     EndDate
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-06    |     2016-01-16
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-07    |     2016-01-17
2016-01-08    |     2016-01-18
2016-01-08    |     2016-01-18
2017-01-01    |     2017-01-10
2026-01-06    |     2026-01-16
2026-01-07    |     2026-01-17

我在存储过程中的查询是:

SELECT ROW_NUMBER() OVER ( ORDER BY [StartDate] ASC) as ROWNUM, [Oid] 
From [dbo].[Ument] 
Where (
        (@StartDate is null or StartDate >= @StartDate)
        or (@EndDate is null or EndDate <= @EndDate)
      )

我希望按用户编写的@StartDate进行搜索,如果为空/空,则按@StartDate >= today的日期进行搜索。

但是,与此同时,我希望按用户编写的@endDate进行搜索,如果为空/空,则EndDate >= today进行搜索。

如果今天是在两个日期之间,我需要退回。

像这样:

@startDate不是空? 是:使用用户编写的@startDate过滤startDate&gt; = @StartDate。 不:今天使用startDate&gt; =今天。

@endDate不是空? 是:使用用户编写的@endDate过滤endDate&lt; = @endDate NO:使用max-date(例如:2050/12/31)过滤endDate&lt; = max-Date

3 个答案:

答案 0 :(得分:4)

这是你想要的吗?

WHERE startDate >= COALESCE(@StartDate, GETDATE()) AND
      endDate <= COALESCE(@EndDate, GETDATE())

您可能需要此逻辑,但当前日期没有时间:

WHERE startDate >= COALESCE(@StartDate, CAST(GETDATE() AS DATE)) AND
      endDate <= COALESCE(@EndDate, CAST(GETDATE() AS DATE))

答案 1 :(得分:1)

评论结束后,diabolickman的问题和戈登的回答可以像:

SELECT ROW_NUMBER() OVER ( ORDER BY [StartDate] ASC) as ROWNUM, [Oid] 
From [dbo].[Ument] 
Where (
    StartDate >= ISNULL(@StartDate, CAST(GETDATE() AS DATE))
    AND (@EndDate is null or EndDate <= @EndDate)
)

这样,如果结束日期为空,则忽略结束日期,因此您无需将其与最大日期进行比较。 假设用户想要过滤日期范围,将中间OR更改为AND。 我使用ISNULL而不是COALESCE,只是为了展示另一种选择。

答案 2 :(得分:0)

我认为我的问题已经解决了! :) 我将最后一个解决方案更改为此,查询返回我想要的内容!

SELECT ROW_NUMBER() OVER ( ORDER BY [StartDate] ASC) as ROWNUM, [Oid] From [dbo].[Ument] 
Where (
    StartDate >= ISNULL(@StartDate, CAST(GETDATE() AS DATE))
    and EndDate <= ISNULL(@EndDate, CAST('20501231' AS DATE))
)   

感谢ramazan和Gordon的帮助。 :)