我关于过滤日期的语法有什么问题

时间:2019-12-26 03:59:04

标签: mysql

我想将数据库过滤到发生在4/5/6月和7/8/9月的数据中,这是我的语法:

select
    buyer_id,
    tgl
from data_2017
where
    month(tgl) = 4 or month(tgl) = 5 or month(tgl) = 6 AND
    buyer_id IN (select buyer_id, tgl from data_2017
                 here month(tgl) = 7 or month(tgl) = 8 or month(tgl) = 9);

我不知道哪种语法错误

3 个答案:

答案 0 :(得分:0)

您的直接问题是您有一个伪命问题,其中涉及WHERE子句中缺少括号的情况。您当前的逻辑实际上是在这样做:

WHERE
    MONTH(tgl) = 4 OR MONTH(tgl) = 5 OR (MONTH(tgl) = 6 AND buyer_id IN (... subquery))

您应该在月度检查前后加上括号,以便一起进行评估。  但是,除了解决此问题外,我可能还会使用自联接来编写您的查询:

SELECT DISTINCT
    d1.buyer_id,
    d1.tgl
FROM data_2017 d1
INNER JOIN data_2017 d2
    ON d1.buyer_id = d2.buyer_id
WHERE
    MONTH(d1.tgl) IN (4, 5, 6) AND
    MONTH(d2.tgl) IN (7, 8, 9);

答案 1 :(得分:0)

tgl数据类型是否为DATE?在搜索条件中的列上使用month会阻止mysql使用索引。如果它是DATE,则可以更改查询:

select
    buyer_id,
    tgl
from data_2017
where tgl between '2017-04-01' and '2017-06-30'
and buyer_id in (SELECT DISTINCT buyer_id FROM tgl between '2017-07-01' and '2017-09-30')

答案 2 :(得分:0)

似乎您希望在7/8/9月份中存在的Buyer_id中的任何内容都可以查找4/5/6数据。以下是您当前查询的修改版本:

SELECT
      buyer_id,
      tgl
FROM  data_2017
WHERE MONTH(tgl) IN (4,5,6) 
AND   buyer_id IN (SELECT buyer_id FROM data_2017
                   WHERE  MONTH(tgl) IN (7,8,9) GROUP BY buyer_id);