1

我有这个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_date2013-01-28 的行但也选择空字段

例如:

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

这可行,但未列出那些具有NULL值的行。sd.student_break_date

乱七八糟的吧?我的问题是:如何选择日期不高于 2013-01-28 的空字段和字段

4

2 回答 2

1

尝试这个 ::

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'
于 2013-02-01T08:44:52.157 回答
0

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

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

你实际上是在做 sd.student_startdate>'2013-01-28' AND sd.student_enddate<'2013-01-28'。请注意,其中没有 = ,因此在这两种情况下它实际上都排除了第 28 位。如果您想在子句中实际包含第 28 个,那么 BETWEEN 并没有任何用处。

至于你的问题,假设措辞不好的问题意味着你想要一个 sd.studen_break_date 为空或小于 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')
于 2013-02-01T09:02:38.427 回答