繁体   English   中英

MySQL查询以选择日期,其中字段为NULL或字段日期值不大于另一个日期

[英]MySQL query to select dates where field is NULL or field date value is not greater than another date

我有这个MySQL查询:

SELECT DISTINCT
    *
FROM
    students s
        LEFT JOIN
    (SELECT 
        *
    FROM
        studentabsences a1
    WHERE
        (a1.absence_date = '2013-01-28')) a ON a.absence_student_id = s.student_id
        LEFT JOIN
    (SELECT 
        *
    FROM
        studentabsencenotes b1
    WHERE
        (b1.absence_note_date = '2013-01-28')
    GROUP BY absence_note_student_id) b ON b.absence_note_student_id = s.student_id
        INNER JOIN
    studentdates sd ON sd.student_id = s.student_id
        INNER JOIN
    coursecategory ctc ON s.student_course_category_id = ctc.category_id
WHERE
    '2013-01-28' BETWEEN sd.student_startdate AND sd.student_enddate
ORDER BY s.student_lastname , s.student_firstname

现在,我想补充的另一个WHERE clause来选择并没有更大的行sd.student_break_date比2013年1月28日还要选择空字段

例如:

WHERE '2013-01-28' >= sd.student_break_date

此方法有效,但未列出sd.student_break_date中具有NULL值的那些行。

凌乱吧? 我的问题是:如何选择空白字段以及日期不高于2013-01-28的字段

尝试这个 ::

WHERE sd.student_break_date is null OR  '2013-01-28' >= sd.student_break_date

或者您可以尝试::

WHERE sd.student_break_date is null OR  sd.student_break_date<'2013-01-28'

要么 ::

WHERE IFNULL(sd.student_break_date,'2013-01-27') <'2013-01-28'

对于这段代码,BETWEEN是一个奇怪的代码

'2013-01-28' BETWEEN sd.student_startdate AND sd.student_enddate

您实际上是在做sd.student_startdate>'2013-01-28'和sd.student_enddate <'2013-01-28'。 注意那里没有=,所以在两种情况下它实际上都排除了第28位。 如果您想在子句中实际包含28号,那么BETWEEN并不是真正的用处。

至于您的问题,假设措辞不佳意味着您想要一个sd.studen_break_date,该值可以为null或小于28,那么它将是

WHERE sd.student_startdate>'2013-01-28' AND sd.student_enddate<'2013-01-28' AND (sd.student_break_date is null OR sd.student_break_date<='2013-01-28')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM