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 日期过滤器:当开始日期 = 结束日期时返回结果的主要内容,如果未能解决你的问题,请参考以下文章

第四十三章 SQL函数 DATEDIFF

开始日期结束日期列上的 JSON Linq.js 过滤器

使用开始/结束日期过滤Neo4j中的关系

(My)SQL:如果子查询不是空集,则返回子查询

mysql获取指定日期是当年第几周,指定日期所在周的开始和结束日期

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值