我有一个包含此条目的表格:
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
答案 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的帮助。 :)