0

ヘルプ!データベースの 1 つの列は日付用です。残念ながら、私の日付はすべて文字列形式 (YYYY.MM.DD) です。私は大規模なデータベース(300 + GB)を持っているので、理想的には変換を避けたいと思っています.

YYYY.MM.DD と YYYY.MM.DD の間の日付の行を選択する方法はありますか? スクリプトはどのようになりますか?

ありがとうございました!

4

3 に答える 3

2

月と日が先行ゼロで格納されている場合、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!」もそうです。)

于 2013-07-14T21:00:06.503 に答える
1

Betweenin 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')
于 2013-07-14T20:57:12.550 に答える
1

良い解決策ではありませんが、うまくいきます(多くのパフォーマンスを犠牲にします)。

日付を年、月、日の順にフォーマットしたので (日時に変換せずに文字列を比較するのに適しています)、試すことができます

SELECT * FROM Table WHERE StringDate > '2013.07.10' AND StringDate < '2013.07.14' 

先行ゼロのない 1000 年より前の日付 ('999.07.14') がある場合、悪い結果が返されます。

しかし、それが大きなデータベースでどのように機能するかはわかりません。

SQL フィドル

于 2013-07-14T20:43:35.607 に答える