MySQL查询案例适用于30天,60天和未计划的输出

时间:2014-04-29 21:03:52

标签: mysql

我已经构建了以下查询以尝试&执行以下操作:

  1. 如果omSchedDate =今天的0到30天,则标记" 30天"
  2. 如果omSchedDate =今天的31至60天,则标记" 60天"
  3. 如果omSchedDate在今天的0天之前或在60天之后,则标记" Not Scheduled"

    SELECT DATEDIFF(tblcom.omSchedDate, CURDATE()) AS age,
    
    CASE 
    WHEN tblcom.omSchedDate > CURDATE() AND tblcom.omSchedDate < (DATE_ADD(CURDATE(),
    INTERVAL 31 DAY))THEN '30 Days'
    WHEN DATEDIFF(CURDATE(), tblcom.omSchedDate) > 30 THEN '60 Days'
    WHEN DATEDIFF(CURDATE(), tblcom.omSchedDate) <= 0 then 'Not Scheduled'
    WHEN DATEDIFF(CURDATE(), tblcom.omSchedDate) IS NULL then 'Not Scheduled'
    ELSE NULL
    END AS consch
    
    FROM      tblcom 
    ORDER BY tblcom.omSchedDate
    
  4. 上面的我的查询为我提供了30天列的正确输出,但是&#34; 60天&#34; &安培; &#34;未计划&#34;列不正确?

    Age, conSch
    -728,60 Days
    -726,60 Days
    -715,60 Days
    -666,60 Days
    -102,60 Days
    -88,60 Days
    -46,60 Days
    -15,
    -14,
    -5,
    -4,
    2,30 Days
    3,30 Days
    6,30 Days
    14,30 Days
    27,30 Days
    28,30 Days
    30,30 Days
    41,Not Scheduled
    41,Not Scheduled
    83,Not Scheduled
    188,Not Scheduled
    

1 个答案:

答案 0 :(得分:2)

这里有很多问题。首先,在DATEDIFF操作中,您的减法顺序相反。它应该是:

WHEN DATEDIFF(omSchedDate, CURDATE()) > 30 THEN '60 Days'
WHEN DATEDIFF(omSchedDate, CURDATE()) < 0 THEN 'Not Scheduled'

其次,您没有检查差异超过60天,因此您需要添加该AND并且需要在检查前添加它超过30天,否则大于60的值将永远不会达到那个检查。

WHEN DATEDIFF(omSchedDate, CURDATE()) > 60 THEN 'Not Scheduled'

第三,如果omSchedDate可能为NULL(这是你的最终DATEDIFF行最终为空的唯一方式),那么你应该首先检查它以防止可能的错误:

CASE
WHEN omSchedDate IS NULL THEN 'Not Scheduled'

您也可以将您的其他行翻译为DATEDIFF,并留下:

CASE
    WHEN omSchedDate IS NULL THEN 'Not Scheduled'
    WHEN DATEDIFF(omSchedDate, CURDATE()) BETWEEN 0 AND 30 THEN '30 Days'
    WHEN DATEDIFF(omSchedDate, CURDATE()) > 60 THEN 'Not Scheduled'
    WHEN DATEDIFF(omSchedDate, CURDATE()) > 30 THEN '60 Days'
    WHEN DATEDIFF(omSchedDate, CURDATE()) < 0 THEN 'Not Scheduled'
    ELSE NULL
END AS consch