MySQLのDATETIME型を日付で抽出

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,791

Z-TALBO

score 489

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

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

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

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

// 年月日で検索するフォーム
<select name="year">
<select name="month">
<select name="day">
<input type="submit" value="検索">
// 間はもう省略しております。

// POSTの受取
$year = $_POST['year'];
$month = $_POST['month'];
$day = $_POST['day'];

// DB
$dbh = connectDb();
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $dbh->prepare(
  "SELECT * FROM テーブル ORDER BY name WHERE date = ?");

// 問題の箇所、、、
POSTの値をdateにまとめて?$dateとして送る?
すみません、動き的な部分などわかっていないので、、、

$stmt->execute();


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

よろしくお願いします。

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


追記

$serch_time = $year . '/' . $month . '/' . $day;
省略
("SELECT * FROM テーブル ORDER BY name ASC WHERE CAST(period_dttm AS DATE) = ?");

$stmt->bindValue(1, $serch_time, PDO::PARAM_STR);


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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


動作確認はphpMyAdminにて。

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/05 17:57

    回答ありがとうございます!
    私のほうも、phpmyadminで確認しましたらヒットしました!

    POSTからの組み立てがやっているのですが、どうもうまくいきません、、、
    見ていただいてもよろしいでしょうか?
    追記いたします。

    キャンセル

  • 2016/03/05 20:50

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

    キャンセル

  • 2016/03/05 21:29

    すみません!
    入れ替えたらなんの問題もなく抽出できました!

    新たにコードも書いていただきありがとうございます!

    キャンセル

  • 2016/03/05 21:42

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

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る