-3

次のようなテーブルが 1 つあります。

   +-----+------------+
   | no  | Date       |
   +-----+------------+
   | 1   | 10/11/2011 |
   | 2   | 10/12/2011 |
   | 3   | 10/13/2011 |
   | 4   | 10/14/2011 |
   | 5   | 10/15/2011 |
   +-----+------------+

次のクエリを作成しましたが、列に dd/mm/yyyy の形式でdate格納されているため、何も返されません。varchar

SELECT * 
FROM   tablname 
WHERE  date BETWEEN '10/11/2011' AND '10/15/2011'

日付が dd/mm/yyy 形式で保存されている場合、2 つの日付の間の値を見つけるにはどうすればよいですか?

誰か助けてくれませんか?

前もって感謝します

4

4 に答える 4

6

本当にデータを varchar として保持する必要がある場合は、最初にそれを PHP にプルする必要はありません。これにはMySQLの日時関数を使用できます

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

SELECT STR_TO_DATE(YourDateColumn,'%d/%m/%Y') AS RealDateColumn 
FROM YourTable

多分

SELECT *
FROM YourTable
WHERE STR_TO_DATE(YourDateColumn,'%d/%m/%Y')  < '2011-01-01'
于 2012-04-06T14:23:41.133 に答える
3

日付をMySQLのDATE列タイプの1つではなくVARCHARに格納している場合は、MySQLのSTR_TO_DATE関数を使用する必要があります(Cylindricの回答を参照)。

もちろん、列の型をDATE型またはDATETIME型に変更する方がはるかに優れています。これを行うには、新しいタイプで新しい列を作成し、既存の列のデータを文字列から日付に変換し、既存の列を削除して、新しい列の名前を古い列の名前に変更するのが最善です。

于 2012-04-06T14:10:55.203 に答える
1

日付を varchar として格納することには、より多くのスペースが必要になる、日付以外の値を入力できる、文字列が正しく比較されないなど、いくつかの問題があります。

したがって、短い答えは次のとおりです。日付を文字列として保存しないでください。

少し長い答えは、varchar を DATE 型に変換してから比較することです。変換は世界で最も効率的なものではないため、一度だけ実行して保存してください。新しい列を追加して元の日付値を変換するか (これが私が行うことです)、テーブルを変更して現在の日付列の型を変更する方法のいずれかを選択します (おそらく、より「正しい」方法です)。メソッドですが、もう少し手間がかかり、現在のデータの使用方法によっては、問題が発生する可能性があります)。

于 2012-04-06T14:20:31.497 に答える
0

以前の回答が示したように、日付を日付型として保存するのが最善です。日付を文字列として保存することが理にかなっているユースケースがいくつかあります。その場合、日付を YYYYMMDD として保存する必要があります。これにより、並べ替えとともに期待どおりに機能することができます。

そうは言っても、部分文字列/連結関数を使用して目標を達成できます。何かのようなもの:

SELECT * FROM tablname WHERE
CONCAT(substring(`date`,7,4),substring(`date`,1,2),substring(`date`,3,2)) 
BETWEEN
CONCAT(substring('10/11/2011',7,4),substring('10/11/2011',1,2),substring('10/11/2011',3,2)) AND
CONCAT(substring('10/11/2011',7,4),substring('10/11/2011',1,2),substring('10/11/2011',3,2));

このアプローチが推奨されない理由は明らかだと思います。

于 2012-04-06T14:45:01.793 に答える