重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PHP4.x.xです。
初心者です。

ショッピングカートの注文データを閲覧するページで
「今月一ヶ月間の売り上げ」という表示の仕方をしたいです。

売り上げテーブルのorder_dateというフィールドに注文された日時がUNIX時間(エポック秒)で入っています。

人力で2009年11月1日0時の数値を求め、2009年11月30日11時59分59秒の数値を求め、select * order where order_date >******* and order_data <****** とすることは簡単なのですが・・・あまりにも美しくない、かつ何年後までやるねん・・・と面倒くさい。

何かいい方法でしょうか?

A 回答 (3件)

質問内容から察するに、月初め(2009年11月1日0時0分0秒)と月末日(2009年11月30日11時59分59秒)をいちいち人力で求めたくないということですか?


(年・月を入力したくない。月の最終日をわざわざ調べて入力したくない)

年・月を入力せず、今月のみでよいのなら下記のようなのはどうでしょう?
月の末日($ed)は翌月の0日で求められました。(越年も対応:2010/1/0=>2009/12/31)

-------------- ↓ここから↓ ----------------
<?php
$year = date('Y', time());
$month = date('n', time());
$st = mktime( 0, 0, 0, $month, 1, $year);
$ed = mktime(23, 59, 59, $month+1, 0, $year); // 翌月0日=当月最終日

$sql = "select * order where order_date >={$st} and order_data <={$ed}";

echo("sql:".$sql."<br>\n");

// 以下は確認用
echo("st:".$st."<br>\n");
echo("ed:".$ed."<br>\n");
$st_stm = date("Y / m / d H:i:s", $st);
$ed_stm = date("Y / m / d H:i:s", $ed);
echo("st_stm:".$st_stm."<br>\n");
echo("ed_stm:".$ed_stm."<br>\n");
?>
-------------- ↑ここまで↑ ----------------

(確認テストなど)任意の年・月で行ないたいなら
$year = $_GET['y'];
$month = $_GET['m'];
などを使って下さい。(要バリデーション)
    • good
    • 0

SQLの特徴として、BETWEENを使った方が効率的なヒットをするようです。

    • good
    • 0

UNIX_TIMESTAMP関数を利用して以下のようなSQL文ではどうでしょうか?



SELECT * FROM `order` WHERE `order_date` >= UNIX_TIMESTAMP('2009-11-1 00:00:00') AND `order_date` <= UNIX_TIMESTAMP('2009-11-30 23:59:59');

また2009年11月は2009年11月1日0時0分0秒『以上』で2009年12月1日0時0分0秒『より小さい』範囲ですから不等号をきちんと使い分けて以下のようにした方が楽だとおもいます。末日を計算する手間が省けますから。

SELECT * FROM `order` WHERE `order_date` >= UNIX_TIMESTAMP('2009-11-1 00:00:00') AND `order_date` < UNIX_TIMESTAMP('2009-12-1 00:00:00');
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!