Mysql 在SQL中使用日期范围

Mysql 在SQL中使用日期范围,mysql,sql,Mysql,Sql,我通过Excel通过ODBC连接访问SQL和数据库。这样我可以创建可刷新的报告。在使用日期介于之间的条件时,我会使用?,这样我就可以在不同的日期范围内经常使用此报告 问题是,当我使用或条件时,我必须输入4次日期范围,或输入8个不同的日期。有没有办法简化下面的内容,这样我就不必重复输入日期了 Select CFF2X AS TYPE, Count(*) AS COUNT FROM ZBP602F.SIH JOIN ZBP602UF.NRCMCVL1 ON SICUST=CUSTX W

我通过
Excel
通过
ODBC
连接访问SQL和数据库。这样我可以创建可刷新的报告。在使用日期
介于
之间的条件时,我会使用
,这样我就可以在不同的日期范围内经常使用此报告

问题是,当我使用
条件时,我必须输入4次日期范围,或输入8个不同的日期。有没有办法简化下面的内容,这样我就不必重复输入日期了

 Select CFF2X AS TYPE, Count(*) AS COUNT
 FROM  ZBP602F.SIH 
 JOIN ZBP602UF.NRCMCVL1 ON SICUST=CUSTX 
 WHERE SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 and CFF2X <> (' ') AND      IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109) 
 OR  SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06)  and SITOT <> 0 and CFF2X = (' ') AND   IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111) 
 OR  SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 AND IHOCLS IN (114) and   SIPAY in ('A', 'E')
 OR SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 AND IHOCLS IN (114) and  SIPAY = 'B' and CFF2X <> (' ')
 Group by CFF2X
选择CFF2X作为类型,计数(*)作为计数
来自ZBP602F.SIH
在SICUST=CUSTX上连接ZBP602UF.NRCMCVL1
你在哪里?然后呢?SICOMP IN(01、03、06)和SITOT 0以及CFF2X(“”)和IHOCLS IN(004、800、007、100、008、102、104、140、105、110、111109)
还是在两者之间?然后呢?SICOMP IN(01,03,06)和SITOT 0以及CFF2X=('')和IHOCLS IN(004,800,007,008,100,102,104,140,105,110,111)
还是在两者之间?然后呢?SICOMP在(01,03,06)中,SITOT 0和IHOCLS在(114)中,SIPAY在('A','E')中
还是在两者之间?然后呢?SICOMP IN(01,03,06),SITOT 0和IHOCLS IN(114),SIPAY='B'和CFF2X('')
按CFF2X分组
SIINVD在哪里?然后呢?和SICOMP IN(01,03,06)和SITOT 0
及(
(CFF2X''和
IHOCLS IN(004、800、007、100、008、102、104、140、105、110、111109)
)
或(CFF2X=''和
IHOCLS(004、800、007、008、100、102、104、140、105、110、111)
)
或(IHOCLS=114,SIPAY in('A','E'))
或(IHOCLS=114,SIPAY='B'和CFF2X')
)

您只需将不变的项放入一次,然后将变化的位放入两个OR语句中。这样简化布尔逻辑的过程称为逻辑归约(想想卡诺图)。这里还可以执行其他优化。

我会尝试使用一些括号来防止重复

如果将WHERE更改为类似以下内容:

WHERE (SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0) AND
  (
    (CFF2X <> (' ') AND IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109)) OR
    (CFF2X = (' ') AND IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111)) OR
    (IHOCLS IN (114) and SIPAY in ('A', 'E')) OR
    (IHOCLS IN (114) and  SIPAY = 'B' and CFF2X <> (' '))
  )
;
WHERE(介于?和?之间的SIINVD和SICOMP IN(01、03、06)和SITOT 0)和
(
(CFF2X(“”)和(004、800、007、100、008、102、104、140、105、110、111109)中的IHOCLS)或
(CFF2X=(“”)和(004、800、007、008、100、102、104、140、105、110、111)中的IHOCLS)或
(IHOCLS IN(114)和SIPAY IN('A','E'))或
(IHOCLS IN(114)和SIPAY='B'和CFF2X('')
)
;

这将首先检查所有记录的SIINVD、SICOMP和SITOT,以确定所有记录都是相同的查询。然后将匹配4个不同的案例。由于缺少括号,您当前的查询可能不会真正执行您所想的操作。

太棒了,它成功了!非常感谢!我在学校学到了一点,但我还没有在像今天这样的现实工作环境中尝试过。很高兴知道!我该怎么做P@SQUISH请参见答案左侧的投票(向上/向下)按钮下方应有一个复选标记。当你点击它时,它应该会被填充。非常感谢您的快速帮助。@SQUISH如果这个答案解决了您的问题,那么不要走开。我明白了,我只能接受一个答案,即使多个答案都是很好的答案:(…对不起,杰夫)。
WHERE (SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0) AND
  (
    (CFF2X <> (' ') AND IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109)) OR
    (CFF2X = (' ') AND IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111)) OR
    (IHOCLS IN (114) and SIPAY in ('A', 'E')) OR
    (IHOCLS IN (114) and  SIPAY = 'B' and CFF2X <> (' '))
  )
;