4

データベースで日付範囲を検索しようとしています。問題は、データベースで datetime 列タイプを使用できないことです。これを補うために、日付は 3 列で表示されます。月列、日列、年列です。これが私の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 に答える
1

PeterM が言ったように、これはパフォーマンスに悪影響を与える可能性がありますが、これらを整数として保存する場合は、次のようにすることができます: (年 * 10000) + (月 * 100) + 日は常に 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 に答える