windows7のmysqlで今日の日付から、今月の日付をテーブルに格納した
い。例えば、テーブルのtimecardで、
日付 出社時刻 退社時刻
と言うのが有って、事前に日付のフィールドを予め作りたい時にどの様
にして日付を作るのかと言う事です。
日付に関しては、curdate()で今日の日付が例えば、2016-02-10と出ま
す。この値を使って日数は、day(last_day(curdate()))で29と出ます。
160201から、160229迄を日付としてinsert intoをしたいのですが。繰
り返しの数は、day(last_day(curdate()))で得られます。
問題は、160201から160229をどの様にしてデータを作って追加するのか
と言う事ですが。その辺の処理が良く分かりません。
済みませんが、sqlの例示をお願いします。
宜しくお願いします。
No.1
- 回答日時:
MySQL自体が持つプログラム機能を使えばできないことはないですが
結構めんどくさい
むしろPHPなど外部プログラムで流し込む方が数倍楽ですが
どうしてもMySQL側で処理したいですか?
phpは分かりませんが、perlは分かりますのでperlでも作れない事は無
いとは思いますが。私は、mysqlに付いては、素人ですので。後々の事
を考えたらmysqlの文法を覚える意味では有意義なのではと思ったりも
した物ですから。
mysqlで組んだらどう言う構成になるのかが興味は有ります。若し、宜
しければ後学の意味で教えて貰えないでしょうか。
多分にこれは一発では作れないのでprocedureで作るとは思いますが。
宜しくお願いします。
No.2
- 回答日時:
>多分にこれは一発では作れないので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;
有難う御座います。動きました。
ここで、一つ質問が有ります。
INSERT IGNORE INTO MYTABLE VALUES (@D);で、
テーブルに書き込みますが、この場合はテーブルには一つしかフィール
ドが無いので(と)でフィールドの指定は要らないのでしょうか。
また、これと関連して
CREATE TABLE IF NOT EXISTS MYTABLE(`d` DATE NOT NULL UNIQUE);
上記の`d`のバッククォートの意味が分かりません。今迄は普通に何も
付けないでフィールドの名前を指定していたのですが。この場合のバッ
ククォートを付ける意味は何なんでしょうか。
以上の二点が分かりません。
済みません。また回答をお願いします。
No.3ベストアンサー
- 回答日時:
>動きました。
それはよかった
>テーブルに書き込みますが、この場合はテーブルには一つしかフィール
>ドが無いので(と)でフィールドの指定は要らないのでしょうか。
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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLで、同じ値が何回連続す...
-
<SQL>重複しているデータの場合...
-
直近1ヶ月に誕生日を迎える社員...
-
mysqlでunixtimeによる日付範囲...
-
NULLは表示順最下位
-
DISTINCTROWについてです。
-
最新の日付と2番目の日付のデー...
-
SQLローダーCSV取込で、囲み文...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
テーブルの最後(最新)のレコー...
-
int型フィールドにnullを登録で...
-
ファイルの漢数字の順番につい...
-
AccessのSQL文で1件のみヒット...
-
エクセル、並び替え正しくソー...
-
配列に指定した値が含まれてい...
-
select文の実行結果に空白行を...
-
レコードの登録順がおかしい
-
count関数の値をwhere句で使用...
-
ワイルドカード検索として合致...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
最新の日付と2番目の日付のデー...
-
DISTINCTROWについてです。
-
MySQL「 INT」「 DATETIME」違い
-
直近1ヶ月に誕生日を迎える社員...
-
SQLで、同じ値が何回連続す...
-
【ExcelVBA】入力された日付か...
-
mysqlに格納されている日付のデ...
-
SQLです教えてくださいお願いし...
-
SQL 重複しないJoinの仕方を教...
-
Mysqlで最新の日付を持つデータ...
-
mysqlでunixtimeによる日付範囲...
-
MySQLで特定のグループの上位3...
-
日付検索で0001-01-01 00:00:00...
-
MySQLのtimestamp型について
-
先期末日の日付を求めるSQL
-
EXCEL 日付範囲内の日数カウン...
-
mysqlコマンドとPHPで同じSQLの...
-
mysqlのif文かcase文で複数条件...
おすすめ情報
create tableで、バッククォートを付けるのはこの場合は予約語とかぶるので必要と言う事でしょうか。また、フィールドが一つの場合のinsert intoはフィールドの指定は要らないのでしょうね。
と思いますが。どうでしょうか。
declareと言うのは、procedureの中で使われるローカル変数と言う事でしょうか。
またbeginとendは複数の行をprocedureの中で記述をする時には必要と言う事でしょうか。