2016-05-22 5 views
0

私はしばらくの間、無数のstackoverflowの答えを読んできたが、まだそれをひっくり返すことはできません!テーブルから日付を選択 - strtotime?

私はdb内にdobというフィールドを持つテーブルを持っています。このフィールドは現在のところTEXTフィールドです(ただし、それ以降はDATEフィールドに変更しようとしましたが、まだ動作しません)。

DOBフィールドのデータは、この形式(英国日付) - 22/05/2016です。

誕生日が2つの日付の間にあるユーザーの数を調べようとしています。例えば

、過去2年間で生まれた誰:

$twoyearsago=date('d/m/Y', strtotime("-2 years")); 
$today = date("d/m/Y"); 

$sql = mysql_query("SELECT * FROM users WHERE dob >= '" . $twoyearsago . "' AND date <= '" . $today . "' ORDER by id DESC"); 

私も試してみました:

$sql = mysql_query("SELECT * FROM users WHERE dob BETWEEN '" . date('d-m-Y', strtotime($twoyearsago)) . "' AND '" . date('d-m-Y', strtotime($today)) . "'"; 

私のロジックであり、あなたがどこイムを見ることを望んでどこうまくいけば、あなたが見ることができます間違っている - どんな助けも認められるだろう。 STR_TO_DATE

ジャック

+0

私は、データベースの日付がタイムスタンプであると推測していますか? – Qirel

+0

これは、あなたの日付が 'Year-month-day'フォーマットの場合にのみ行うことができます – Peter

答えて

1

多くのローカル日付形式の問題は、字句順と時系列順が異なることです(例:16-11-2016は字句的に11-12-2016の後、時系列の前に来る)。そのため、一部の地域形式の文字列フィールドに日付を格納することは、ほとんどの場合、悪い考えであり、遅かれ早かれソートの問題が発生します。その後

$today = date("Y-m-d"); 
$twoyearsago=date("Y-m-d", strtotime("-2 years")); 

実際にそれを置くthe documentation

で説明したようにMySQLのために文字通りの日付を指定して、あなたは、特定の形式を尊重する必要が次に、範囲変数は次のようになります。組み込み関数str_to_dateを使用して、文字列を正確に比較できる日付に変換します。

SELECT * FROM users WHERE 
STR_TO_DATE(dob, '%d/%m/%Y') between '$twoyearsago' and '$today' 

これはうまくいくでしょうが、長期的には、dob列をより明確になり、国際化が容易になり、パフォーマンスが向上するので、doB列を実際の日付形式(@BerndBuffenが示すように)に変換するほうがはるかに優れています。

サイドノート:あなたは引き続き長期的に廃止されたmysql_拡張機能を使用しています。実際にはmysqli_またはPDOに切り替える必要があります。

2

あなたの日付

NOTE変換することができます:はTIMESTAMPにあなたが1970-01-前の日付を格納することができますので、私は、DATEにTIMESTAMPから列タイプを変更しました01。

SELECT STR_TO_DATE('22/05/2016 '、'%d /%m /%Y ');

サンプル

MariaDB [bb]> SELECT STR_TO_DATE('22/05/2016','%d/%m/%Y'); 
+--------------------------------------+ 
| STR_TO_DATE('22/05/2016','%d/%m/%Y') | 
+--------------------------------------+ 
| 2016-05-22       | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

MariaDB [bb]> 

ので、あなたは

ALTER TABLE `users` 
ADD COLUMN new_dob DATE; 

UPDATE `users` SET new_dob = str_to_date(dob,'%d/%m/%Y'); 

** Verify the dates 

ALTER TABLE `users` 
DROP COLUMN dob; 

ALTER TABLE `users` 
CHANGE COLUMN `new_dob` `dob` DATE; 

** CREATE an INDEX for perfomance ** 

ALTER TABLE `users` 
ADD KEY (`dob`); 

あなた表を変更することができますあなたが旧姓

SELECT * from `users` where dob between '2014-01-01' AND `2015-08-01'; 
+0

より良いパフォーマンスのためにdobのインデックスを追加して私の答えを変更しました –

+0

ありがとう、テキストの – it05jb

0

を選択dでは文字列ではなく、実際の日付値を使用してクエリを作成します。したがって、照会にはYYYY-MM-DDという形式が必要です。

以下を試してください。

$twoyearsago=date('Y-m-d', strtotime("-2 years")); 
$today = date("Y-m-d"); 

$sql = mysql_query("SELECT * FROM users WHERE STR_TO_DATE(dob, '%d/%m/%Y') >= '" . $twoyearsago . "' AND STR_TO_DATE(dob, '%d/%m/%Y') <= '" . $today . "' ORDER by id DESC"); 

STR_TO_DATE(DOB、 '%dを/%はm /%Y')は必ずあなたのD/M/Yは、MySQLを理解して比較することができ、クエリで日付に変換するDOBの文字列値を保存します指定されたYYYY-MM-DD値。 実際には、日付フィールドを作成し、dobフィールドに文字列としての日付値を常に渡さない限り、同じ関数を使用してdob文字列値を日付としてこの新しいフィールドに転送します。

0

もう1つの方法は、DateTimeを使用し、クエリを実行する前に日付をフォーマットすることです。

$begin = '10/02/2014'; 
$emd = '10/02/2015'; 

$beginDate = DateTime::createFromFormat('d/m/Y', $begin); 
$emdDate = DateTime::createFromFormat('d/m/Y', $emd); 

$stmt = " 
SELECT 
... 
FROM users 
WHERE birthday >= '".$beginDate->format('Y-m-d')."' 
AND birthday <= '".$endDate->format('Y-m-d')."' 
"; 
関連する問題