【问题标题】:Stored Procedure - Start and end date, looking at today's date存储过程 - 开始和结束日期,查看今天的日期
【发布时间】:2016-04-17 17:46:13
【问题描述】:

我有一个包含这些条目的表:

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 &gt;= today 的日期搜索。

但是,同时,我想通过@endDate 搜索,由用户编写,或者如果为空/空,则搜索EndDate &gt;= today

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

像这样:

@startDate 不为空? YES:使用用户编写的@startDate 过滤startDate >= @StartDate。 否:使用今天的日期输入 startDate >= today。

@endDate 不为空? YES:使用用户编写的@endDate 过滤 endDate

【问题讨论】:

  • 你的 sql 的输出是什么?你想要的输出是什么?
  • 我不明白这个问题,但我认为第二个“OR”(..*or* (@EndDate..) 在您的标准中应该是“AND”。
  • 对不起,把存储过程放在有疑问的地方就行了。

标签: sql-server date stored-procedures


【解决方案1】:

这是你想要的吗?

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))

【讨论】:

    【解决方案2】:

    在评论之后,恶魔的问题和戈登的回答可以混合如下:

    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,只是为了展示另一种选择。

    【讨论】:

      【解决方案3】:

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

      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 的帮助。 :)

      【讨论】:

      • 我希望他们不会在 2051 年后使用这个 :)
      • 啊哈 :D 只是一个测试日期! :) 我要改变! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多