【问题标题】:MariaDB SELECT query with date_add()MariaDB SELECT 查询与 date_add()
【发布时间】:2020-07-06 04:38:47
【问题描述】:

我有一个奇怪的特殊销售查询:

(1)

select date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) from tutoring_disponibilities where date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) NOT IN (SELECT date(tutoring_sessions.startDate) from tutoring_sessions);

这不返回任何内容,但是这(这是 where 的第一部分): (2)

select date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) 
    from tutoring_disponibilities;

返回:

'2020-03-30'
'2020-03-30'
'2020-03-31'
'2020-03-31'
'2020-03-25'
'2020-03-25'

这部分: (3)

SELECT date(tutoring_sessions.startDate) from tutoring_sessions;

返回这个:

'2020-01-29'
NULL
NULL
NULL
'2020-02-05'
'2020-02-05'
'2020-02-10'
'2020-02-11'
'2020-02-18'
'2020-02-17'
'2020-02-25'
'2020-02-24'
'2020-03-02'
'2020-03-09'
'2020-03-16'
'2020-03-23'
'2020-02-13'
'2020-02-13'
'2020-02-13'
'2020-02-24'
'2020-02-29'
'2020-03-14'
'2020-03-30'
'2020-03-30'
'2020-03-30'

我们可以看到'2020-03-30'在查询(3)的结果和查询(2)的结果中,但是查询(2)的其他结果没有出现在查询(3)的结果中. 那么为什么 query(1) 什么都不返回呢? 如果您知道表达此代码的更好方法,我将很乐意提供任何帮助!

【问题讨论】:

    标签: mysql sql select mariadb


    【解决方案1】:

    我的建议是不要将NOT IN 与子查询一起使用。原因是子查询中的 any NULL 值导致不返回任何行。

    我推荐NOT EXISTS。但是,您的表达式相当复杂,因此对您的查询最简单的解决方法是:

    NOT IN (SELECT date(tutoring_sessions.startDate)
            FROM tutoring_sessions
            WHERE tutoring_sessions.startDate IS NOT NULL
           )
    

    使用tutoring_sessions(startDate) 上的索引,等效的NOT EXISTS 也可能会明显更快。

    【讨论】:

    • 非常感谢!我不知道任何空值都会导致不返回任何行。你知道有什么方法可以更好地表达我的代码吗?这段代码的目的是获取两个表的匹配日期,考虑到在tutorial_sessions 中日期存储为时间戳,而在tutoring_disponibilities 中,日期只是天(0-6)和小时,然后它会找到最接近当前日期的可处置性
    • @EmanueleSacco 。 . .你有一个复杂的表达式,所以你最好坚持使用WHERE 版本,除非你发现性能是一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2021-05-08
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多