質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

8593閲覧

MySQLのDATETIME型を日付で抽出

Z-TALBO

総合スコア525

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/03/05 06:39

編集2016/03/05 09:03

DBのtableの設計で
id,
name,
body,
date datetime
とdateに関してはdatetime型とし、date('Y-m-d H:i:s);
で値を飛ばして保存しています。

ただdateを抽出してから、分解するのは下記のコードを見つけたのでやってみました。

PHP

1while ($row = $stmt->fetch()) : 2 $datetime = $row['date']; 3 list ($year, $month, $day, $hour, $minutes, $second) = preg_split('/[-: ]/', $datetime);

ここからが本題の質問になりますが、
日付で検索するのに、どのような形になるのか?お聞きしたいと思います。

PHP

1// 年月日で検索するフォーム 2<select name="year"> 3<select name="month"> 4<select name="day"> 5<input type="submit" value="検索"> 6// 間はもう省略しております。 7 8// POSTの受取 9$year = $_POST['year']; 10$month = $_POST['month']; 11$day = $_POST['day']; 12 13// DB 14$dbh = connectDb(); 15$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 16$stmt = $dbh->prepare( 17 "SELECT * FROM テーブル ORDER BY name WHERE date = ?"); 18 19// 問題の箇所、、、 20POSTの値をdateにまとめて?$dateとして送る? 21すみません、動き的な部分などわかっていないので、、、 22 23$stmt->execute();

要するに、時間は関係なく、検索したい年月日を入れるとその年月日に合うデータを抽出したいのですが、datetimeだった時のがよくわかっていません。

よろしくお願いします。

自分の浅い考えですが、
$date1 = $year $month $dayと
$date2 = $year $month $day +1
みたいので、date1からdate2っていう範囲選択をする感じになるのでしょうか?


追記

PHP

1$serch_time = $year . '/' . $month . '/' . $day; 2省略 3("SELECT * FROM テーブル ORDER BY name ASC WHERE CAST(period_dttm AS DATE) = ?"); 4 5$stmt->bindValue(1, $serch_time, PDO::PARAM_STR);

一応、2016/03/05のような感じにはしたのですが、エラーがでております。。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

datetime型をdate型へCASTして比較すれば良いかと。

period_dttm列がdatetime型で2016-01-30 10:12:27という値が入っている場合には以下クエリでヒットします。

SQL

1SELECT * FROM deadstock_table WHERE CAST(period_dttm AS DATE ) = '2016/01/30' 2または 3SELECT * FROM deadstock_table WHERE CAST(period_dttm AS DATE ) = '2016/1/30' 4でもOKでした。

動作確認はphpMyAdminにて。

POSTされた年月日(year, month, day)から比較文字列を2016/1/30のように組み立ててください。
テーブルの列名にdateを使っているようですが予約語と紛らわしい名前は使わない方が無難だと思います。


【追記】(3/5 21:00)
ORDER BY 句は最後に記述します。ORDER GYやGROUP BY句は記述する順番がありますので注意してください。
以下、動作確認したコードです。

PHP

1<? 2 $y = "2016"; 3 $m = "1"; 4 $d = "30"; 5 $value = $y ."/" . $m . "/" . $d; 6 $sql = $pdo->prepare('SELECT * FROM deadstock_table where CAST(period_dttm AS DATE )=? ORDER BY stock_id ASC'); 7 $sql->bindValue(1, $value, PDO::PARAM_STR); 8?>

投稿2016/03/05 07:16

編集2016/03/05 12:02
chinyato

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/03/05 08:57

回答ありがとうございます! 私のほうも、phpmyadminで確認しましたらヒットしました! POSTからの組み立てがやっているのですが、どうもうまくいきません、、、 見ていただいてもよろしいでしょうか? 追記いたします。
chinyato

2016/03/05 11:50

打ち合わせで外出していて遅くなりました。ORDER BY 句はwhere句の後ろに書かないとエラーになると思います。
Z-TALBO

2016/03/05 12:29

すみません! 入れ替えたらなんの問題もなく抽出できました! 新たにコードも書いていただきありがとうございます!
chinyato

2016/03/05 12:42

PHPも始めてから15年経ってずいぶん変わり、自分の再勉強にもなるのでお気になさらず。PDOも当時は無くSQL文をごりごり書いて実行していた時代もありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問