1

データベースに日付を varchar として保存しています。特定の日付の間の値を取得するために、SQL で演算子を使用してデータにアクセスしようとするとbetween、日付を varchar として保存したため、適切な出力が得られません。日付はこの形式です(01/12/2013)(dd/mm/yyyy)

日付を varchar から日付形式に変更せずに between ステートメントを使用して正しいデータにアクセスするアイデアはありますか?

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

4

5 に答える 5

1

データ型について混乱しないでください-それはあなたの問題とは何の関係もありません。日付の/を削除すると、これが表示されます-実数を取得するには: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   
于 2013-02-08T07:08:02.440 に答える
0

基本的に、私が間違っていなければ、データ形式を変更せずに解決策を探しています。データが日付であることが明示的に言及されていない場合、オペレータ間で理解できません。したがって、このフィールドは日付であると言わざるを得ません。すべてのデータベースには、date()、to_date() などの同様の関数があります。使用しているデータベースがわからないため、解決方法の正確な構文を提供することはできません。でも、簡単に見つけられると思います。詳細が必要な場合はお知らせください。

于 2013-02-08T05:14:41.567 に答える
0

日付を 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');
于 2013-02-08T05:04:07.810 に答える
0

次のクエリを書くだけです

select * 
from table 
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'
于 2013-02-08T05:11:10.133 に答える
0

念のため、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);
于 2013-02-08T05:06:41.920 に答える