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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Visual Basic(VBA) VBAで列を削除 3 2023/02/01 11:00
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
- Visual Basic(VBA) 【再投稿】VBAのシフト表でバグが出て困っています 3 2022/09/24 08:29
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- Excel(エクセル) Excel関数式で該当月日のみ表示し、それ以外の月日を空白にしたい。 1 2022/07/17 11:59
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Excel(エクセル) Excelについて 3 2023/07/12 17:47
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
mysqlでunixtimeによる日付範囲...
-
SQL 重複しないJoinの仕方を教...
-
NULLは表示順最下位
-
複数のテーブルから値を合計出...
-
最新の日付と2番目の日付のデー...
-
DISTINCTROWについてです。
-
SELECT FOR UPDATE で該当レコ...
-
SQLローダーCSV取込で、囲み文...
-
2つの列が同じ値の行を取得するSQL
-
【PL/SQL】FROM区に変数を使う方法
-
updateで複数行更新したい
-
1の行を固定した上でVBAを用い...
-
count関数の値をwhere句で使用...
-
「数字で始まらない」ものを抽...
-
ソートについて
-
Insert文直後に自動採番(auto_i...
-
アクセスのレポートでレコード...
-
単一グループのグループ関数で...
-
これをSQL文で出来るでしょうか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
mysqlでunixtimeによる日付範囲...
-
SQL 重複しないJoinの仕方を教...
-
最新の日付と2番目の日付のデー...
-
DISTINCTROWについてです。
-
日付検索で0001-01-01 00:00:00...
-
MySQLで日付(date)型のdefaul...
-
MySQLで特定のグループの上位3...
-
mysqlコマンドとPHPで同じSQLの...
-
MySQLのdatetime型に0月0日を格納
-
SQLで、同じ値が何回連続す...
-
EXCEL 日付範囲内の日数カウン...
-
Mysqlで最新の日付を持つデータ...
-
サブクエリを使わない方法
-
mysqlに格納されている日付のデ...
-
先期末日の日付を求めるSQL
-
mysqlのif文かcase文で複数条件...
-
直近1ヶ月に誕生日を迎える社員...
-
MySQL「 INT」「 DATETIME」違い
おすすめ情報
create tableで、バッククォートを付けるのはこの場合は予約語とかぶるので必要と言う事でしょうか。また、フィールドが一つの場合のinsert intoはフィールドの指定は要らないのでしょうね。
と思いますが。どうでしょうか。
declareと言うのは、procedureの中で使われるローカル変数と言う事でしょうか。
またbeginとendは複数の行をprocedureの中で記述をする時には必要と言う事でしょうか。