知道为什么日期 WHERE 子句不起作用吗?

Any idea why the date WHERE clause is not functioning?

此查询返回 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 子句都可以使用。我总是以相同的方式过滤日期字段。

您的条件相当于:

(
 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'

问题是缺少括号,但您也可以简化日期逻辑和 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 年 3 月 1 日的最后一分钟。

在 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