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
现在我想补充的另一个WHERE
clause
以选择有行不更大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')
之间实际不包括的界限间隔比较。即'x与y和z'之间的转换为'x> = y AND x