【问题标题】:SQL wildcard for date parameter in stored procedure存储过程中日期参数的 SQL 通配符
【发布时间】:2018-01-29 11:43:05
【问题描述】:

我有一个带有单个参数@date的存储过程

该过程是一个select 语句,其中包含:

where dateTimeGmt between @date and dateadd(dd,9,@date)

我希望能够调用此过程并使用表中的所有日期获取所有结果。

@date 设置为%NULL%-%-% 不起作用。

如果没有使用exec 传递参数,是否有一种优雅的方式让过程忽略where 子句?

【问题讨论】:

  • WHERE dateTimeGmt between @date AND dateadd (dd, 9, @date) OR @date IS NULL 应该可以解决问题
  • 您可能想阅读 Erland Sommarskog 的 Dynamic search conditions in T-SQL

标签: sql-server date stored-procedures wildcard


【解决方案1】:

我希望能够调用此过程并获得所有结果 使用表中的所有日期。

将@date 设置为 % 或 NULL 或 %-%-% 不起作用。

% 比较仅适用于字符串类型,不适用于日期

是否有一种优雅的方式让程序忽略 where 子句如果没有参数传递给exec?

尝试如下更改 where 子句。

where (dateTimeGmt between @date and dateadd(dd,9,@date) ) or @date  IS NULL

【讨论】:

  • 这是如何工作的? NULL is NULL 返回所有内容,那么为什么当日期为 OR 时仍返回子集?在 NULL 和 NULL 之间不返回任何内容,在这种情况下 NULL 是 NULL 返回所有内容。有没有很好的逻辑分解?
  • 如果您将值传递给日期参数,如果行日期在定义的日期之间(true 或 false => true),则条件的第一部分将返回 true,如果不是,则第一部分为false so (false or false => false) 它不会返回该行。对于 date 参数为 null 的第二种情况,第二部分始终为 true,因此(false 或 true =>true)对于每一行,它将返回查询的每一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多