プロが教える店舗&オフィスのセキュリティ対策術

windows7のmysqlで今日の日付から、今月の日付をテーブルに格納した
い。例えば、テーブルのtimecardで、
日付 出社時刻 退社時刻

と言うのが有って、事前に日付のフィールドを予め作りたい時にどの様
にして日付を作るのかと言う事です。

日付に関しては、curdate()で今日の日付が例えば、2016-02-10と出ま
す。この値を使って日数は、day(last_day(curdate()))で29と出ます。

160201から、160229迄を日付としてinsert intoをしたいのですが。繰
り返しの数は、day(last_day(curdate()))で得られます。

問題は、160201から160229をどの様にしてデータを作って追加するのか
と言う事ですが。その辺の処理が良く分かりません。

済みませんが、sqlの例示をお願いします。
宜しくお願いします。

質問者からの補足コメント

  • どう思う?

    create tableで、バッククォートを付けるのはこの場合は予約語とかぶるので必要と言う事でしょうか。また、フィールドが一つの場合のinsert intoはフィールドの指定は要らないのでしょうね。

    と思いますが。どうでしょうか。

      補足日時:2016/02/10 14:25
  • どう思う?

    declareと言うのは、procedureの中で使われるローカル変数と言う事でしょうか。
    またbeginとendは複数の行をprocedureの中で記述をする時には必要と言う事でしょうか。

      補足日時:2016/02/10 14:30

A 回答 (3件)

MySQL自体が持つプログラム機能を使えばできないことはないですが


結構めんどくさい
むしろPHPなど外部プログラムで流し込む方が数倍楽ですが
どうしてもMySQL側で処理したいですか?
    • good
    • 0
この回答へのお礼

phpは分かりませんが、perlは分かりますのでperlでも作れない事は無
いとは思いますが。私は、mysqlに付いては、素人ですので。後々の事
を考えたらmysqlの文法を覚える意味では有意義なのではと思ったりも
した物ですから。

mysqlで組んだらどう言う構成になるのかが興味は有ります。若し、宜
しければ後学の意味で教えて貰えないでしょうか。

多分にこれは一発では作れないのでprocedureで作るとは思いますが。
宜しくお願いします。

お礼日時:2016/02/10 13:22

>多分にこれは一発では作れないのでprocedureで作るとは思いますが。


とりあえずある程度知識がある前提で以下サンプル

→準備、テーブルをつくっておく
CREATE TABLE IF NOT EXISTS MYTABLE(`d` DATE NOT NULL UNIQUE);

→プロシージャを作る
DROP PROCEDURE IF EXISTS MYPROCEDURE;
DELIMITER //
CREATE PROCEDURE MYPROCEDURE(IN D DATE)
BEGIN
DECLARE LAST_DAY DATE;
SET @D=DATE_FORMAT( D, '%Y-%m-01');
SET LAST_DAY=LAST_DAY( D );
WHILE @D <= LAST_DAY DO
INSERT IGNORE INTO MYTABLE VALUES (@D);
SET @D := @D + INTERVAL 1 DAY;
END WHILE;
END
//
DELIMITER ;

→今日のデータから実行
CALL MYPROCEDURE(CURDATE());

(参考)特定の日付から
CALL MYPROCEDURE('2016-03-15');

→確認
SELECT * FROM MYTABLE;
    • good
    • 0
この回答へのお礼

有難う御座います。動きました。
ここで、一つ質問が有ります。

INSERT IGNORE INTO MYTABLE VALUES (@D);で、
テーブルに書き込みますが、この場合はテーブルには一つしかフィール
ドが無いので(と)でフィールドの指定は要らないのでしょうか。

また、これと関連して
CREATE TABLE IF NOT EXISTS MYTABLE(`d` DATE NOT NULL UNIQUE);

上記の`d`のバッククォートの意味が分かりません。今迄は普通に何も
付けないでフィールドの名前を指定していたのですが。この場合のバッ
ククォートを付ける意味は何なんでしょうか。

以上の二点が分かりません。
済みません。また回答をお願いします。

お礼日時:2016/02/10 14:21

>動きました。


それはよかった

>テーブルに書き込みますが、この場合はテーブルには一つしかフィール
>ドが無いので(と)でフィールドの指定は要らないのでしょうか。
VALUESで指定する引数の個数と、テーブルのカラム数が同じ場合は省略可能です
気持ち悪ければ
INSERT IGNORE INTO MYTABLE (`d`) VALUES (@D);
としてください

>この場合のバッククォートを付ける意味は何なんでしょうか。
よくある予約語対策です。
予約語と競合しない場合はバッククォートは不要です
テーブルの日付カラムにdateとかつける人もよく見受けられるので
カラムだけにでも付けといたほうが気休めにはなります。
本来ならデータベース名やテーブル名にもつけます。

>declareと言うのは、procedureの中で使われるローカル変数と言う事でしょうか。
今回はそうなりますね
DECLARE自体はその他のカーソルや条件・ハンドラの定義などにつかいます
https://dev.mysql.com/doc/refman/5.6/ja/declare. …

>またbeginとendは複数の行をprocedureの中で記述をする時には必要と言う事でしょうか。
複合ステートメントの構文です
https://dev.mysql.com/doc/refman/5.6/ja/begin-en …
    • good
    • 0
この回答へのお礼

ありがとう

有難う御座いました。
これで大方の疑問が解けたのですっきりしています。

親切な回答有難う御座いました。

お礼日時:2016/02/10 15:03

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