MySQL查询选择日期,其中字段为空或字段日期值不大于其他日期

问题描述:

我有这个MySQL查询更大: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 

现在我想补充的另一个WHEREclause以选择有行不更大sd.student_break_date比2013年1月28日还要选择空字段

例如:

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

这可以工作,但sd.student_break_date中没有列出NULL值的那些行。

凌乱,是吧?我的问题是:如何选择是空字段和字段,其中日期不高于2013年1月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' 

OR ::

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'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') 
+0

之间实际不包括的界限间隔比较。即'x与y和z'之间的转换为'x> = y AND x