2017-04-24 111 views
0

我试图在给定的日期范围之前和之后提取x天。我制定了如下查询给定日期范围之前和之后的x日期的SQL查询

SELECT a,b,date FROM table.test 
WHERE date < "2012-09-07" - INTERVAL 2 DAY 
    AND date > "2012-09-08" + INTERVAL 2 

另一种方法是不BETWEEN方法也。他们似乎都没有给我正确的答案。该datevarchar(30) DEFAULT NULL类型的数据库中

样本数据

a b date 
2 4 2012-09-07 
3 2 2012-09-05 
5 3 2012-09-08 
7 4 2012-09-07 
8 5 2012-09-06 
9 6 2012-09-07 
3 7 2012-09-09 

什么我找了下列文件:

a b date 
3 2 2012-09-05 
3 7 2012-09-09 

datevarchar(30) DEFAULT NULL类型的数据库中

+0

是否有任何理由为什么你的数据库日期不是日期字段? –

+0

我只是从数据库中提取数据。我也有同样的问题 – Betafish

+0

编辑你的问题,并提供样本数据和期望的结果。 –

回答

1

Go for this:

SELECT a,b,date 
    FROM table.test 
WHERE date < str_to_date('2012-09-07', '%Y-%m-%d') - INTERVAL 2 DAY 
    OR date > str_to_date('2012-09-08', '%Y-%m-%d') + INTERVAL 2 DAY; 

主要是,AND需要替换为OR。我更喜欢expicit(日期)类型转换。

更新:仔细重新阅读你的问题,上面的陈述可能不是你正在寻找的。如果戈登去是正确的,如果你想使用BETWEEN你可能会去的:

SELECT a,b,date 
    FROM table.test 
WHERE date BETWEEN str_to_date('2012-09-07', '%Y-%m-%d') - INTERVAL 2 DAY AND 
        str_to_date('2012-09-08', '%Y-%m-%d') + INTERVAL 2 DAY 
    AND date NOT BETWEEN str_to_date('2012-09-07', '%Y-%m-%d') AND 
         str_to_date('2012-09-08', '%Y-%m-%d'); 

这是基本相同的。

+0

我了解您的查询。但奇怪的是,我得到'2012-11-13 12:31:10' ''2013-01-11 04:43:35' '2012-10-09 14:40:58' '2015-07 -22 14:49:34' '2014-07-12 11:20:02' '2013-04-17 21:33:16' '2012-10-26 10:02:51' '2013 -09-05 08:28:54' '2015-06-01 13:47:32' '2012-10-20 17:17:25' '2015-11-23 00:49:47' '2015-10-19 04:36:35' '2014-05-21 08:27:10' '2013-06-17 00:37:23' '2014-09-15 13:11:47 “'。我刚刚在我的mysql工作台上复制了你的查询。 – Betafish

+0

再次仔细阅读,我认为戈登Linoff是在正确的轨道上,是不是?虽然我仍然不是隐式类型转换的朋友......;) – Trinimon

1

请让你比较落后:

SELECT a, b, date 
FROM table.test 
WHERE (date >= '2012-09-07' - INTERVAL 2 DAY AND 
     date < '2012-09-07' 
    ) OR 
     (date > '2012-09-08' AND 
     date <= '2012-09-08' + INTERVAL 2 
    ); 

我不知道,如果你想>/<>=/<=