2016-06-13 4 views
1

私のSQL要求に問題があります。SQL "BETWEEN"要求が私の望むように動作しません

ここで要求だ:

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING `format_date` BETWEEN '07/06/2016' AND '16/06/2016' 

私は「2014年7月11日」ような結果を望んでいない取得要求を実行します。いくつかのテストをした後、リクエストはその日だけを考慮に入れているように見えますが、なぜその理由が分かりません。何か案は ?あなたの問題は、以下の式にまとめることができ

+1

どのようなデータ型のあなたの日付列のですか? –

+0

タイプはvarcharです。 DBMSはPhpmyadmin – coco

+4

です*** *** NOT ***は日付を 'VARCHAR'列に格納します。これまで –

答えて

2

07/11/2014は、2つの与えられた文字列の間です。あなたは日付ではなく文字列を比較していますが、あなたが求めるものを正確に得ています。

これは、あなたが比較するものである:

"07/0" < "7月1日" < "16/0"

実際の日付を比較してみたり、あなたの文字列をフォーマットそれらを使用することができます(YYYY/MM/DD)。この質問(とその受け入れられた答えは)あなたが使用可能な日付にあなたの文字列を変換に役立つはず

how-to-convert-a-string-to-date-in-mysql

あなたがお互いに本当の日付を、その後copmpareすることができます。あなたが間違った結果を得るもの

+0

申し訳ありませんが、私は何が間違って見る。しかし、自分のdd/mm/yyyyをyyyy/mm/ddに変更するためにどのような方法を使うべきかわかりません。手伝ってくれる ? – coco

+0

@cocoあなたの文字列を日付に変換するために、関連する質問へのリンクをSOに追加しました。 – oerkelens

0

...

SELECT '8' BETWEEN '7' AND '77'; 
+--------------------------+ 
| '8' BETWEEN '7' AND '77' | 
+--------------------------+ 
|      0 | 
+--------------------------+ 
1

理由はすでに明確である、あなたは次のよう試すことができます;)

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING STR_TO_DATE(`format_date`, '%d/%m/%Y') BETWEEN STR_TO_DATE('07/06/2016', '%d/%m/%Y') AND STR_TO_DATE('16/06/2016', '%d/%m/%Y') 

そして、私はあなたがWHEREHAVINGを変更すべきだと思います。

0

解決すべき3つの問題があります。

  1. 最も簡単なのは、WHEREの代わりにHAVINGを誤って使用したことです。

  2. dd/mm/yyyyの形式で日付を文字列に変換しました。ここでの問題は、テキスト(文字列)が数字のように振る舞わないということです。テキスト1と10は2か3より前にソートされています。このため、日付のように見える文字列の間にTEXTを要求していますが、数値を日付として扱う必要があるため、動作しません。

  3. 間は、日付範囲を処理するための非常に貧弱な方法です。はるかに信頼性の高い方法は、以下のように> =と<の組み合わせを使用することです。

SELECT SUBSTR(Date, 1, 11) AS `format_date` 
FROM table 
WHERE `date` >= '2016-06-06'' AND `date` < '2016-06-17' 
関連する問題