【问题标题】:Any idea why the date WHERE clause is not functioning? [duplicate]知道为什么 date WHERE 子句不起作用吗? [复制]
【发布时间】:2021-03-28 20:17:13
【问题描述】:

此查询返回 2017 年、2018 年和超出范围的其他日期的结果。

SELECT 

    base.number [CTSK Number],
    base2.number [CHG Number],
    base.active [Active],
    chg.u_start_date__date_ [Start Date],
    usergroup2.name [Coordinating Group],
    coordinator.name [Coordinator],
    requester.name [Requester],
    manager.name [Group Manager /S.P.O.C.],
    base.short_description [Task Title],
    base.approval [Approval Status],
    assignee.name [Assignee],
    usergroup.name [Assignment Group],
    rejection.u_rejection_reason [Rejection Reason],
    chg.u_regression_count [Regression Count],
    chg.u_change_task_rejection_count [CHG CTSK Rejection Count],
    base.reassignment_count [CTSK Reassignment Count],
    base2.reassignment_count [CHG Reassignment Count]

FROM SN20_TASK base

    LEFT JOIN SN20_CHANGE_TASK task ON base.sys_id = task.sys_id
    LEFT JOIN SN20_CHANGE_REQUEST chg ON task.change_request = chg.sys_id
    LEFT JOIN SN20_TASK base2 ON chg.sys_id = base2.sys_id
    LEFT JOIN SN20_SYS_USER_GROUP usergroup2 ON base2.assignment_group = usergroup2.sys_id
    LEFT JOIN SN20_SYS_USER_GROUP usergroup ON base.assignment_group = usergroup.sys_id
    LEFT JOIN SN20_SYS_USER coordinator ON base2.assigned_to = coordinator.sys_id
    LEFT JOIN SN20_SYS_USER requester ON base2.opened_by = requester.sys_id
    LEFT JOIN SN20_SYS_USER manager ON usergroup2.manager = manager.sys_id
    LEFT JOIN SN20_SYS_USER assignee ON base.assigned_to = assignee.sys_id
    LEFT JOIN SN20_U_Approval_Rejection_Reasons rejection ON task.u_reject_reason = rejection.sys_id
   
WHERE 

    chg.u_start_date__date_ BETWEEN '2020-01-01 00:00:00' AND '2020-03-01 23:59:00'
    AND base.assignment_group = 'f1a0f8a76f2bc900c6032fe64f3ee4e5'
            OR (base.assignment_group = '4eb7dcae6f138d002ed488864f3ee4ed')
    AND base.sys_class_name LIKE 'change_task'

我做错了什么?在我做过的所有其他查询中,where 子句都会起作用。日期字段是我始终以相同方式过滤的内容。

【问题讨论】:

    标签: sql where-clause


    【解决方案1】:

    你的条件相当于:

    (
     chg.u_start_date__date_ BETWEEN '2020-01-01 00:00:00' AND '2020-03-01 23:59:00'
     AND 
     base.assignment_group = 'f1a0f8a76f2bc900c6032fe64f3ee4e5'
    )
    OR 
    (
     base.assignment_group = '4eb7dcae6f138d002ed488864f3ee4ed')
     AND 
     base.sys_class_name LIKE 'change_task'
    )
    

    因为运算符AND 的优先级高于OR

    使用括号:

    chg.u_start_date__date_ BETWEEN '2020-01-01 00:00:00' AND '2020-03-01 23:59:00'
    AND 
    (base.assignment_group = 'f1a0f8a76f2bc900c6032fe64f3ee4e5' OR base.assignment_group = '4eb7dcae6f138d002ed488864f3ee4ed')
    AND 
    base.sys_class_name LIKE 'change_task'
    

    或运营商IN

    chg.u_start_date__date_ BETWEEN '2020-01-01 00:00:00' AND '2020-03-01 23:59:00'
    AND 
    base.assignment_group IN ('f1a0f8a76f2bc900c6032fe64f3ee4e5', '4eb7dcae6f138d002ed488864f3ee4ed')
    AND 
    base.sys_class_name LIKE 'change_task'
    

    【讨论】:

    • 感谢您的详尽回复!
    【解决方案2】:

    问题是缺少括号,但您也可以简化日期逻辑和IN

    WHERE chg.u_start_date__date_ >= '2020-01-01' AND
          chg.u_start_date__date_  < '2020-03-02' AND
          base.assignment_group IN ('f1a0f8a76f2bc900c6032fe64f3ee4e5', '4eb7dcae6f138d002ed488864f3ee4ed') AND
          base.sys_class_name LIKE 'change_task'
    

    这假设您确实想要 2020-03-01 的最后一分钟。

    【讨论】:

    • 非常好,非常感谢
    【解决方案3】:

    在 where 子句中使用 or 会导致此问题。 base.assignment_group的条件用括号()括起来。

    where
    chg.u_start_date__date_ BETWEEN '2020-01-01 00:00:00' AND '2020-03-01 23:59:00'
        AND ( base.assignment_group = 'f1a0f8a76f2bc900c6032fe64f3ee4e5'
                OR base.assignment_group = '4eb7dcae6f138d002ed488864f3ee4ed')
        AND base.sys_class_name LIKE 'change_task
    

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2021-04-24
      • 2015-07-12
      • 1970-01-01
      • 2013-05-13
      相关资源
      最近更新 更多