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