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

このQ&Aに関連する最新のQ&A

A 回答 (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 …
    • good
    • 0
この回答へのお礼

ありがとう

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

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

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

>多分にこれは一発では作れないので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

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


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

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

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

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

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

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Qphpでnot null、a_iでテーブル作成

PHPで、以下のようなソースで、存在しているデータベースtestに接続し、もしない場合、name_listというテーブルを作り、1カラム目をカラム名がnoで、int型でnot null auto_incrementにして、2カラム目をカラム名がnameで、not nullで作りたいのですが、うまくテーブルが作られません。
どうすればうまく作られるか教えてください。

<?php
try{
$pdo = new PDO('mysql:dbname=test; host=localhost; charset=utf8', 'root');
$st = $pdo->prepare("create table if not exists name_list (no int(100) not null auto_increment, name varchar(100) not null);");
$st->execute();
}catch(PDOException $e){
print('Error:'.$e->getMessage());
die();
}

PHPで、以下のようなソースで、存在しているデータベースtestに接続し、もしない場合、name_listというテーブルを作り、1カラム目をカラム名がnoで、int型でnot null auto_incrementにして、2カラム目をカラム名がnameで、not nullで作りたいのですが、うまくテーブルが作られません。
どうすればうまく作られるか教えてください。

<?php
try{
$pdo = new PDO('mysql:dbname=test; host=localhost; charset=utf8', 'root');
$st = $pdo->prepare("create table if not exists name_list (no int(100) no...続きを読む

Aベストアンサー

PRIMARY KEYを設定してください。

create table if not exists name_list (no int(100) not null auto_increment PRIMARY KEY, name varchar(100) not null)


ところで、、、
以前、create table if not existsというクエリを流せばいいと回答しましたが、
サーバサイドで動かしているプログラムは基本的にテーブルありきで実装すると思います。
ですからIF NOT EXISTSというようにするというのはちょっとおかしいかな?と思いました。

QMySQL 一つのテーブルで登録日と更新日カラムのCURRENT_TIMESTAMPの使い方について

ローカルで作成したMySQLのテーブルデータをサーバーに移したいのですが、スムーズにいかずにいます。(ローカルのphpMyAdminよりエクスポートした、sqlファイルを編集したものをサーバー側のphpMyAdminよりインポートしています。)

特に、登録日と更新日のカラムのCURRENT_TIMESTAMPに問題があるようで、下記のようなメッセージがでます。2つは無理とのことです。

#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause  

しかし、ローカルではちゃんと定義されているので、なぜサーバーになると無理なのかがわかりません。

このようなSQLの文章になっていますが、どのように書けば、2つのCURRENT_TIMESTAMPの存在が可能になりますでしょうか?
よろしくお願いましす。

CREATE TABLE IF NOT EXISTS `comment` (
`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`post_id` int(11) DEFAULT NULL,
`content` text CHARACTER SET utf8,
`reg_tim` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`upd_tim` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

ローカルで作成したMySQLのテーブルデータをサーバーに移したいのですが、スムーズにいかずにいます。(ローカルのphpMyAdminよりエクスポートした、sqlファイルを編集したものをサーバー側のphpMyAdminよりインポートしています。)

特に、登録日と更新日のカラムのCURRENT_TIMESTAMPに問題があるようで、下記のようなメッセージがでます。2つは無理とのことです。

#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause  
...続きを読む

Aベストアンサー

バージョンやエンジンによるかもしれませんが
もともとタイムスタンプは1テーブルに1カラムしか許可されていませんでした
いまは複数カラムのタイムスタンプが設定できるようですが
defaultにCURRENT_TIMESTAMPを指定できるのは1カラムだけなので
他のカラムにはdefault 0でよいので設定をかいておくとよいでしょう
(default値を指定しないとCURRENT_TIMESTAMPを指定しようとするみたい)

Q2つのテーブルをまとめて1つのテーブル作成

テーブルAはid、名前、住所、電話番号のカラムがあり、データが入っております。
テーブルBもid、名前、住所、電話番号のカラムがあり、データが入っております。

これまでは二つのテーブルを利用しておりましが、二つのテーブルの構成が同じで、二つのテーブルに分けておく必要がない為、今後は二つのテーブルを1つにまとめて、テーブルCを作成して利用したいと思いました。

この場合はどのような方法で作成出来ますでしょうか。
また、今回は1つのテーブルにまとまればいいので、テーブルCを作成するまでもなく、テーブルAの中にテーブルBの内容をそのまま入れる方法もあるかと思うのですが、そちらの方法も教えていただけますでしょうか。

よろしくお願いします。

Aベストアンサー

テーブルCを更新しないなら、二つを結合したビューを作るのが一番簡単かと
create view C(...) as select ... from A union all select ... from B
参考)
http://dev.mysql.com/doc/refman/5.6/en/union.html
http://dev.mysql.com/doc/refman/5.6/en/create-view.html

更新するなら、素直にテーブルCにデータを移転してA,Bは廃棄でしょう
create table C(...) select ... from A
insert into C(...) select ... from B
drop table A,B
参考)
http://dev.mysql.com/doc/refman/5.6/en/create-table-select.html
http://dev.mysql.com/doc/refman/5.6/en/drop-table.html

Q日付・区分でグループ化して、日付最終のデータ値をとりだしたい

日付の月と区分でグループ化して
月の最終日データの値を取得したいのですが
どうすればいいのでしょうか?
値は必ずしもMAXとは限らないのです。

よくわかっていないのですが
サブクエリとかを使用すればできるんでしょうか?

日付,区分,値
2015-01-01,1,2500
2015-01-02,1,2700
2015-02-01,1,3200
2015-02-02,1,700
2015-01-01,2,750
2015-01-03,2,800
2015-02-01,2,1100
2015-02-02,2,1300

データが上記なら

2015-01,1,2700
2015-02,1,700
2015-01,2,800
2015-02,2,1300
と取得する方法です。

よろしくお願いします。

Aベストアンサー

#2です。コピペミスでした

//表示
select t1.年月,t1.区分,t2.値
from(
select date_format(日付,"%Y-%m") as 年月,区分,max(日付) as 日付
from hoge
group by 年月,区分
) as t1
inner join hoge as t2
on t1.日付=t2.日付 and t1.区分=t2.区分;

QPHPでMySQLテーブルロック一覧取得

PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。
Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。

単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか?
PHPから実施できるやり方をご教授頂けると幸いです。

-------Test Program()---------
<?php
$link = mysql_connect('localhost', 'login_id', 'login_pass');
mysql_select_db('db_name');

mysql_query('LOCK TABLES table1 WRITE');
mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"');

//$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。
$result = mysql_query('show processlist');

while ($row = mysql_fetch_assoc($result)){
printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"],
$row["Command"], $row["Time"] , $row["State"], $row["Info"]);
}
mysql_free_result($result);
mysql_query('UNLOCK TABLES');
?>

PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。
Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。

単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか?
PHPから実施できるやり方をご教授頂けると幸いです。

-------Test Program()----...続きを読む

Aベストアンサー

ロックを掛けた接続内では、ブロックされないので、ロック状況の取得は出来ないようです。
テスト状況を作るには、2つ以上の接続を作って、一つは、ロックしたままとする必要があるので、コマンドラインクライアントと、xampp(apache)などのhttpサーバー経由しphpでmysql接続とを駆使して、以下のようにしてみると、どのようにロックが行われているかを見ることが出来ます。
[1]. コマンドラインクライアントから、ロックする
> lock tables `xx_tbl` write;

[2]. phpで、上記ロックしたtableにアクセスするphpプログラム実行
select * from `xx_tbl`
  しかし、writeロックがかかってるので、待機状態になり、結果は返ってこない
  とりあえず、このウィンドウはこのままおいて

[3]. ブラウザの別ウィンドウまたは別のタブから、以下を発行するphpプログラム実行
show processlist;
 → 3スレッドが返ってくる
i: コマンドラインクライアントのスレッド、接続のままさわってなければ、sleep
ii: ロックテーブルにアクセス待機中スレッド、Stateカラム に waiting という記述、Infoカラムに、待機中クエリの内容
  ブロックされたクエリが表示されるだけなので、from 句からロック中のテーブルを推測するしかできない。
iii: show processlist; を発行したスレッド。Infoカラムにそのクエリ

[4]. コマンドラインクライアント で、ロック解除
> unlock tables;
 [2] のウィンドウをそのまま開いていれば、待機終了して、データ取得した結果が表示される。
ということで、ロック中のテーブルへさらに他からアクセスしている時しか、それを関知することはできないようです。

ロックを掛けた接続内では、ブロックされないので、ロック状況の取得は出来ないようです。
テスト状況を作るには、2つ以上の接続を作って、一つは、ロックしたままとする必要があるので、コマンドラインクライアントと、xampp(apache)などのhttpサーバー経由しphpでmysql接続とを駆使して、以下のようにしてみると、どのようにロックが行われているかを見ることが出来ます。
[1]. コマンドラインクライアントから、ロックする
> lock tables `xx_tbl` write;

[2]. phpで、上記ロックしたtableにアクセスするphp...続きを読む


人気Q&Aランキング

おすすめ情報