ヘルプ!データベースの 1 つの列は日付用です。残念ながら、私の日付はすべて文字列形式 (YYYY.MM.DD) です。私は大規模なデータベース(300 + GB)を持っているので、理想的には変換を避けたいと思っています.
YYYY.MM.DD と YYYY.MM.DD の間の日付の行を選択する方法はありますか? スクリプトはどのようになりますか?
ありがとうございました!
ヘルプ!データベースの 1 つの列は日付用です。残念ながら、私の日付はすべて文字列形式 (YYYY.MM.DD) です。私は大規模なデータベース(300 + GB)を持っているので、理想的には変換を避けたいと思っています.
YYYY.MM.DD と YYYY.MM.DD の間の日付の行を選択する方法はありますか? スクリプトはどのようになりますか?
ありがとうございました!
月と日が先行ゼロで格納されている場合、BETWEEN 演算子は期待どおりに機能します。ORDER BYも同様です。
create table your_table (
date_value varchar(10) not null
);
insert into your_table values
('2013.01.01'), ('2013.01.13'), ('2013.01.30'), ('2013.01.31'),
('2013.02.01'), ('2013.02.13'), ('2013.02.28'), ('2013.02.31'),
('2013.03.01'), ('2013.03.15'), ('2013.03.30'), ('2013.03.31');
select date_value
from your_table
where date_value between '2013.01.01' and '2013-01-31'
order by date_value;
2013.01.01
2013.01.13
2013.01.30
構造の主な問題の 1 つは、型の安全性が失われることです。このクエリを見てください。
select date_value
from your_table
where date_value between '2013.02.01' and '2013.02.31'
order by date_value;
2013.02.01
2013.02.13
2013.02.28
2013.02.31
日付、日付時刻、またはタイムスタンプ タイプの列を使用した場合、dbms は値「2013.02.31」の挿入を許可しませんでした。これは、日付のドメインの値ではないためです。これはvarchar のドメインの値です。(そして、許容値を厳しく制限するその列に CHECK 制約がない限り、「Arrrgh!」もそうです。)
Between
in SQL は両方の境界を含みます。それが必要な場合は、次を使用できますbetween
。
where col between 'YYYY.MM.DD' and 'YYYY.MM.DD'
2 つの定数は、探している値です。
列にインデックスがある場合は、 ( 、などとbetween
同様に) インデックスが使用されます。値を変換する必要はありません。定数が何らかの形式の日付である場合、 を使用して正しい形式で文字列を作成できます。たとえば、過去 1 週間以内の日付を取得するには、次のようにします。>
>=
date_format()
where col >= date_format(adddate(now(), -7), '%Y.%m.%d')
良い解決策ではありませんが、うまくいきます(多くのパフォーマンスを犠牲にします)。
日付を年、月、日の順にフォーマットしたので (日時に変換せずに文字列を比較するのに適しています)、試すことができます
SELECT * FROM Table WHERE StringDate > '2013.07.10' AND StringDate < '2013.07.14'
先行ゼロのない 1000 年より前の日付 ('999.07.14') がある場合、悪い結果が返されます。
しかし、それが大きなデータベースでどのように機能するかはわかりません。