データベースに日付を varchar として保存しています。特定の日付の間の値を取得するために、SQL で演算子を使用してデータにアクセスしようとするとbetween
、日付を varchar として保存したため、適切な出力が得られません。日付はこの形式です(01/12/2013)(dd/mm/yyyy)
。
日付を varchar から日付形式に変更せずに between ステートメントを使用して正しいデータにアクセスするアイデアはありますか?
ありがとうございました。
データ型について混乱しないでください-それはあなたの問題とは何の関係もありません。日付の/を削除すると、これが表示されます-実数を取得するには:2013年2月20日は、実際には2014年1月2日より2100万以上高くなっています
2013年2月20日=200220132014年1月2日
=1022014
varcharに日付、月、年の順序の番号がある場合-正しい値を取得するには、フィールドまたはクエリで番号を並べ替える必要がありますが、年月日である場合は、ちょうどソートされるvarcharがあります日時のように。
解決策1: テーブルにあるままにしておく必要がある場合は、次のことを行う必要があります。
データベーステーブル:
CREATE TABLE `dates` (
`date_varchar` varchar(15) DEFAULT NULL,
`date_datetime` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
データ:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
クエリ:
SELECT *
FROM dates
WHERE STR_TO_DATE(date_varchar,'%d/%m/%Y')
BETWEEN '2013-02-03' AND '2013-02-04'
2つのレコードを返します:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
解決策2:
varcharの順序を、フィールドの年、月、日付に変更します。以下の表データを参照してください。
date_varchar date_datetime
2013/02/01 2013-02-01 00:00:00
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
2013/02/04 2013-02-04 00:00:00
2013/02/05 2013-02-05 00:00:00
2013/03/03 2013-03-03 00:00:00
2014/02/03 2014-02-03 00:00:00
今、あなたは選択することができます:
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '2013/02/02' AND '2013/02/03'
これで、番号は日時と同じ方法で並べ替えられます。/と-を削除するだけで番号を確認できます。したがって、varcharはdate_timeと同じように並べ替えられます
クエリは同じ2つの行を返します。
date_varchar date_datetime
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
解決策3:
テーブルを変更したくないので、これはあなたのためではありませんが、これを完了するためにテーブルを含めます。データ型をdatetimeに変更すると、数値を正しい順序に並べる必要があり、このクエリを使用して日付間の範囲を取得します。
SELECT *
FROM dates
WHERE date_datetime
BETWEEN '2013-02-03' AND '2013-02-04'
同じ2つのレコード:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
問題の例:
ここで、varcharが返す日付を選択するだけで、ご想像のとおり、最初のクエリとそれ以上の2つのレコードが、あなたに起こっていることと同じようになります。
データ:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '03/02/2013' AND '04/02/2013'
date_varchar date_datetime
03/02/2013 2013-02-05 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-02-05 00:00:00
04/02/2013 2013-02-03 00:00:00
基本的に、私が間違っていなければ、データ形式を変更せずに解決策を探しています。データが日付であることが明示的に言及されていない場合、オペレータ間で理解できません。したがって、このフィールドは日付であると言わざるを得ません。すべてのデータベースには、date()、to_date() などの同様の関数があります。使用しているデータベースがわからないため、解決方法の正確な構文を提供することはできません。でも、簡単に見つけられると思います。詳細が必要な場合はお知らせください。
日付を varchar として保存し、to_date 関数を使用して日付形式に変換し、演算子の間で使用します。
これを試して
SELECT *
FROM orders
WHERE to_date(order_date, 'dd/mm/yyyy') between to_date ('01/12/2012', 'dd/mm/yyyy')
AND to_date ('31/12/2012', 'dd/mm/yyyy');
次のクエリを書くだけです
select *
from table
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'
念のため、MS SQL を使用している場合:
SELECT *
FROM orders
WHERE CONVERT(DATETIME,order_date,101) between CONVERT(DATETIME,'01/12/2012',101)
AND CONVERT(DATETIME,'31/12/2012',101);