3

ユーザーが送信する簡単なフォームを作成しました。すべてがうまく機能しますが、最近、

SELECT * FROM `Forms` WHERE `Date` BETWEEN '{$startDate}' AND '{$endDate}' 

Dateは typeTEXTです。MM/DD/YYすべてをフォーマットで表示する方が簡単だと思ったので、テキストにする必要がありました 。フォームが正常に機能しているため、データ型を変更するリスクを冒したくありません。

日付列の例

01-03-2013
01-04-2013
07-25-2012
08-01-2012
08-01-2012
08-01-2012
08-01-2012

作業クエリの例

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '12-12-2012'

クエリが機能しない例

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '01-04-2013'

年が変わると壊れる理由はありますか?年が変わってもどうすれば動かせますか?

4

5 に答える 5

5

あなたはそのようにすることができます

SELECT * FROM `Forms` 
WHERE str_to_date(`Date`, '%d-%m-%Y') BETWEEN '2012-01-30' AND '2013-09-29'

デモはこちら

編集 :

ここでテーブルを修正したい場合はどうすればよいですか

  1. DATE適切なデータ型の新しい列を追加します。

    ALTER TABLE `Forms` ADD `new_date` DATE AFTER `Date`;
    
  2. MySQL のSTR_TO_DATE()関数を使用して、古い列に保持されている日付を新しい列に入力します。

    UPDATE `Forms` SET `new_date` = STR_TO_DATE(`Date`, '%d-%m-%Y');
    
  3. 古い列を削除します (必要に応じて、新しい列の名前をその場所に変更します)。

    ALTER TABLE `Forms` DROP `Date`, CHANGE `new_date` `Date` DATE;
    
  4. この新しい列を使用するようにアプリケーションを変更してください。

于 2013-01-04T17:39:39.950 に答える
4

列は列であるため、TEXTMySQL はアルファベット順の比較を使用します。

01-08が前に来る01-04ので、実際にはすでに月の部分が壊れています。

これを修正するには、列をDATE型に変換するか、日付の順序を逆にします。YYYY-MM-DDどちらの場合も、BETWEENは正しく機能するはずです。

于 2013-01-04T17:30:50.030 に答える
2

これを試して::

SELECT * FROM `Forms` Where str_to_date(`Date`, '%d/%m/%Y') Between '01-08-2012' and '12-12-2012'
于 2013-01-04T17:29:16.213 に答える
0

これを試して:

select * from "forms" where Date('column_name') between '' and ''
于 2013-01-04T17:33:49.820 に答える
0

壊れることが心配な場合は、データベースをエクスポートしてから変更してください。これは日付フィールドではなく TEXT フィールドであるため、期待どおりの結果が得られません。MySQL は文字ごとにソートしています。最初の文字を見て、次に次の文字を見ているように。

navnavが言ったように、壊れることはありませんが、バックアップを作成するだけです。

日付のみを表示する場合は、スペースで expand() して日付のみを取得できます。

<?php

list($date, $time) = explode(" ", $datetime, 2);
echo $date;

?>
于 2013-01-04T17:32:53.027 に答える