4

尝试在数据库中搜索日期范围。问题是,我不能在我的数据库中使用 datetime 列类型。作为补偿,日期显示为三列。月列、日列和年列。这是我的 SQL 查询:

SELECT COUNT(*) 
  FROM `import` 
 WHERE `call_day` BETWEEN 29 AND 15 
   AND `call_month` BETWEEN 9 AND 10 
   AND `call_year` BETWEEN 2013 AND 2013

你可以看到我遇到麻烦的地方。call_day 需要在第 29 天和第 15 天之间进行搜索。这行不通,因为 15 小于 29,但我需要它来工作,因为该月在未来 :)

有什么想法/解决方案吗?不,我不能以任何方式更改数据库。只读。

4

4 回答 4

5

连接像 yyyymmdd 这样的值,然后你可以像字符串一样比较它们。

于 2013-10-16T20:00:07.930 回答
3

除了可以通过多种方式实现的连接方法之外,例如

SELECT * 
  FROM import
 WHERE STR_TO_DATE(CONCAT_WS('-', call_year, call_month, call_day), '%Y-%c-%e') 
       BETWEEN '2013-09-29' AND '2013-10-15'

或者

SELECT *
  FROM import
 WHERE CONCAT(call_year, LPAD(call_month, 2, '0'), LPAD(call_day, 2, '0'))
       BETWEEN '20130929' AND '20131015'

这是SQLFiddle演示

这将始终导致全面扫描,并假设您的查询中的日期范围通常不会超过几个月,您也可以这样做

SELECT *
  FROM import
 WHERE (call_year = 2013 AND 
        call_month = 9   AND 
        call_day BETWEEN 29 AND DAY(LAST_DAY('2013-09-01'))) -- or just 30
    OR (call_year = 2013 AND 
        call_month = 10 AND 
        call_day BETWEEN  1 AND 15)

这是SQLFiddle演示

对于跨越一年的查询(例如 from 2012-08-20to 2013-10-15

SELECT * 
  FROM import
 WHERE (call_year = 2012 AND 
        call_month = 8 AND
        call_day BETWEEN 20 AND 31)
    OR (call_year = 2012 AND 
        call_month BETWEEN 9 AND 12 AND
        call_day BETWEEN 1 AND 31)
    OR (call_year = 2013 AND 
        call_month BETWEEN 1 AND 9 AND 
        call_day BETWEEN  1 AND 31)
    OR (call_year = 2013 AND 
        call_month = 10 AND
        call_day BETWEEN 1 AND 15)

这是SQLFiddle演示

于 2013-10-16T20:46:52.300 回答
1

正如 PeterM 所说,这可能会影响性能,但如果您将这些存储为整数,您可以执行以下操作:(year * 10000) + (month* 100) + day 将始终产生一个 8 字节的“日期”。

2013 *10000 = 20130000
9 * 100 =          900
                    15
              20130915

这是一个丑陋的黑客,而且会很昂贵,因为如果你不能以任何其他方式限制行,你将评估表中的每一行,但我认为它会起作用。

编辑:打字很难!

于 2013-10-16T21:02:19.940 回答
0
SELECT COUNT(*) FROM `import` 
WHERE CONCAT(CAST(`call_year`AS CHAR(4)) , RIGHT(CONCAT('00',CAST(`call_month`AS CHAR(2))),2) , RIGHT(CONCAT('00',CAST(`call_day`AS CHAR(2))),2))
BETWEEN '20130929' AND '20131015'
于 2013-10-16T20:01:01.050 回答