SQL 日期过滤器:当开始日期 = 结束日期时返回结果
Posted
技术标签:
【中文标题】SQL 日期过滤器:当开始日期 = 结束日期时返回结果【英文标题】:SQL Date Filter: Return results when start date = end date 【发布时间】:2020-11-09 05:55:28 【问题描述】::startDate 和 :endDate 从 html 输入中获得值,并通过 AJAX 作为参数传递。我想在 :startDate 和 :endDate 之间返回通知,但如果 startDate 等于 endDate 也返回通知。(用户为两个输入框输入相同的日期)。
SELECT name, FK_userID, subject, messageText, recipients,
CONVERT (varchar, date) as date
FROM notifications
LEFT JOIN users ON users.userID =
notifications.FK_userID
WHERE date
BETWEEN :startDate AND :endDate
OR CONVERT (datetime, date) = :startDate
ORDER BY CONVERT (datetime, date, 100) desc
OR 语句打破了第一个条件。该查询仅适用于 BETWEEN 语句。如果用户为 startDate 和 endDate 输入相同的日期值,我希望查询的 OR 部分返回与两个输入框中输入的日期值相同的任何通知。 预期输出如下所示: 开始日期 = 2020 年 10 月 10 日 结束日期 = 2020 年 10 月 10 日
返回日期值为 10/10/2020 的所有通知
【问题讨论】:
那么您的查询不起作用怎么办?考虑将一些示例数据和预期结果显示为格式化文本。date
的数据类型是什么? BETWEEN
包含在内 - 落在 BETWEEN
中的任一表达式上的值将已包含在内。
我不明白这个问题。您编写了查询仅使用 BETWEEN 语句,这意味着您不需要除此之外的任何内容,但是您添加了破坏事物的 CONVERT
语句。删除CONVERT
,您已经回答了自己的问题。
日期的数据类型是日期时间。如果用户为 startDate 和 endDate 输入 10/20/2020,则不会返回日期为 10/20/2020 的任何行,因为它不在这些值之间。如果 startDate 和 endDate 相等,我会尝试包含结果,并且有一行具有该值。
【参考方案1】:
你是说:
查询只使用 BETWEEN 语句。
这是真的,因为BETWEEN 具有包含范围的含义
date BETWEEN :startDate AND :endDate
等同于:
date >= :startDate AND date <= :endDate
这就是为什么您的OR
条件不需要:
OR CONVERT (datetime, date) = :startDate
【讨论】:
以上是关于SQL 日期过滤器:当开始日期 = 结束日期时返回结果的主要内容,如果未能解决你的问题,请参考以下文章