年齢計算方法とデータ更新について

このQ&Aのポイント
  • 以下の質問文章では、PostgreSQLのデータベース内の表であるplayer_tblのbirthdayフィールドの値を使用して、現在の年齢を計算し、nenreiフィールドに格納したいと考えています。
  • しかし、実行したSQLクエリでエラーが発生し、birthdayフィールドの形式を変更する必要があることがわかりました。
  • 質問者は、age関数の中にフィールド名を含める方法を知りたいと述べており、データ数が約10万件あるため一括更新が難しいかどうかも気にしています。
回答を見る
  • ベストアンサー

年齢計算

以下のフィールド構成のテーブルがあるのですが 「birthday」フィールドの値を元に、現時点の年齢を計算して 「nenrei」フィールドに入れたいと考えています。 【player_tbl】 id     ID name   名前 birthday 誕生日(19950203のような形式でデータが入っています) nenrei  計算された年齢を入れる 以下のSQLを実行してもエラーになります。 update player_tbl set nenrei = extract(year from age(current_date, birthday)) ; SQL エラー: ERROR: function age(date, character varying) does not exist HINT: No function matches the given name and argument types. You may need to add explicit type casts. birthdayのところを工夫しないとダメだということは、なんとなくわかるのですが どのように変更すると実現できるのかわかりません。 age関数の中に、フィールド名を入れたい場合は、どのような記述になるのでしょうか? また、データ数は10万件くらいですが、一気に更新するのは難しいでしょうか? DBはPostgreSQLです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

NO.1です。 UPDATE player_tbl SET nenrei = extract(year from age(current_date, to_date(birthday,'YYYYMMDD') )) FROM player_tbl ;

like-linux
質問者

お礼

教えていただきましたSQLで、無事、解決できました。 ありがとうございました。

その他の回答 (1)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

UPDATE の構文は下記のとおり UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...] [ FROM fromlist ] [ WHERE condition ] UPDATE player_tbl SET nenrei = extract(year from age(current_date, birthday)) FROM player_tbl あとbirthday は'YYYY-MM-DD'形式じゃないとだめかも

関連するQ&A

  • zendframework

    以下のテーブルの誕生日のデータを元にnenreiフィールドへ現時点の年齢を更新することをしたいのですが、 (phpでPostgreSQLを使用、フレームワークはZendFramework) 【player_tbl】 id     ID name   名前 birthday 誕生日(19950203のような形式でデータが入っています) nenrei  計算された年齢を入れる phpPgAdminで以下のSQL文を直接実行すると、問題なく更新されるのですが UPDATE player_tbl SET nenrei = extract(year from age(current_date, to_date(birthday,'YYYYMMDD') )) ; ZendFrameworkで、以下のソースを実行すると、うまく更新できません。 $this->_db = DbManager::getConnection(); $sql = 'update player_tbl set '; $sql .= "nenrei = extract(year from age(current_date, to_date(birthday, 'YYYYMMDD'))) ;"; $stt = $this->_db->prepare($sql); $num = $stt->rowCount(); $numは0で返ってきて、更新は0件となります。 上記ソースコードは、何か間違っているでしょうか?。

    • ベストアンサー
    • PHP
  • plpgsqlのエスケープ文字について

    plpgsqlのエスケープ文字について教えてください tblのテーブルのnameフィールドの値をtitleフィールドに更新する関数を作成してます。 cur cursor for SELECT id, name FROM tbl; rec RECO RD; begin open cur; LOOP FETCH cur INTO rec; EXIT WHEM NOT FOUND; w_sql := ''UPDAT tbl SET title = ''; w_sql := w_sql ll '' ''''タイトル: '' ll rec.name ll '' '''' ''; w_sql := w_sql ll '' WHERE id= '' ll rec.id= '' ll rec.id ; EXECUTE w_sql; END LOOP; ・ ・ ・ ・ ・ 上記のようにnameフィールドの値をset句に設定していますが、 nameフィールドには 「90's」 や「men's」 のような値が入ったレコードがあるためエラーとなってしまいます。 name内の「'」をエスケープする為にはどのように書けばよいでしょうか 教えてください

  • Postgreの日付関数に関して教えてください。

    Postgreの日付関数に関して教えてください。 表9.30 日付/時刻関数の例を実行していますが、 make_ で始まる関数がすべて失敗します。 PostgreSQL 9.6.2文書 9.9. 日付/時刻関数と演算子 https://www.postgresql.jp/document/9.6/html/functions-datetime.html 表9.30 日付/時刻関数 select age(timestamp '2001-04-10', timestamp '1957-06-13') select age(timestamp '1957-06-13')  : : select make_date(2013, 7, 15) select make_interval(days => 10) select make_time(8, 15, 23.5) select make_timestamp(2013, 7, 15, 8, 15, 23.5) select make_timestamptz(2013, 7, 15, 8, 15, 23.5) make_dateの失敗のメッセージ ERROR: function make_date(integer, integer, integer) does not exist LINE 1: select make_date(2013, 7, 15) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** エラー ********** ERROR: function make_date(integer, integer, integer) does not exist SQLステート:42883 ヒント:No function matches the given name and argument types. You might need to add explicit type casts. 文字:8 何が悪いのでしょうか。

  • ACCSESSのクエリについて教えてください

    SQL初心者なのですが教えてください!! 現在tbl1とtbl2というテーブルを比べてそれぞれ項目のidが一致した priceのみ10%上乗せした結果を表示させているのですが、 2008/08/10からは率を変えた結果を表示させたく思っております。 tbl1 :id,name tbl2 :id,price iif([tbl1.id]=[tbl2.id],[tbl2.price]*1.1,"該当なし" )AS 上乗せ そこでtbl3というidとdate(日付)の項目のみのテーブルを作成して 以下のように抽出条件をかえたのですが構文エラーとなってしまいます。。 tbl3 :id,date iif([tbl1.id]=[tbl2.id],iif([date]>2008/08/10,[tbl2.price]*1.2,[tbl2.price]*1.1),"該当なし" )AS 上乗せ 申し訳ありませんが上記の場合どのような記載をすればよいか 教えていただけないでしょうか。 ※わかりずらい質問ですみません。。

  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • 条件付きでデータの置換と新規挿入

    教えてください。 id(主)|u_id|date|field1|field2| と言うフィールドを持つテーブル[tbl_1]があります。 ポストするデータのu_idとdateがテーブルのレコードと一致する場合、 field1及びfield2のデータを置換 若しくは、挿入し、 u_idとdateが一致しない場合、新しいレコードを挿入したいと 思うのですが、これをひとつの命令文として行うことはできるでしょうか。 以下、試してみたことです。 replace into tbl_1(field1,field2) value(1111,2222) where u_id='1' and date='20110420' 上記では、シンタックスエラーが返ってきました。 次に、 replace into tbl_1(u_id,date,field1,field2) value(1,20110420,1111,2222) としたところ、u_idとdateが一致するレコードがあっても、 新規レコードとして挿入されました。 1回の命令文で処理を行いたいと思うのですが、 やはり、処理は分けた方が良いのでしょうか。 ご回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MAX関数を使ってからLEFT JOINしたいのですが・・

    毎度お世話になります。 下記2つのテーブルからテーブル結合をして表示させたいのですが、その前にサブテーブルにある時間データの中で最新のものだけと結合したいと考えています。色々試したのですがうまくいきません。どなたかご教授の程よろしくお願いいたします。 main_tbl | id | basyo | name | --------------------- | 1 | 1  | aa  | | 2 | 1  | bb  | | 3 | 2  | cc  | | 4 | 3  | dd  | sub_tbl | id | jyotai | time  | ------------------------ | 1 | 1   |12:25:30| | 1 | 2   |13:15:12| | 2 | 1   |13:20:14| | 1 | 3   |13:50:08| 欲しい結果 | id | basyo | name | jyotai | time | --------------------------------------- | 1 | 1  | aa  | 3   |13:50:08| | 2 | 1  | bb  | 1   |13:15:12| | 3 | 2  | cc  | null  | null | | 4 | 3  | dd  | null  | null | 考えた構文 $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN (SELECT MAX(time) FROM sub_tbl GROUP BY id) ON main_tbl.id = sub_tbl.id"; または $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN sub_tbl on main_tbl.id = sub_tbl.id WHERE SELECT MAX(time) FROM sub_tbl GROUP BY id"; または $sql1 = "SELECT MAX(time) FROM sub_tbl GROUP BY id"; $rs1 = mysql_db_query($db,$sql1) or die("sql Error!"); $sql = "SELECT main_tbl.id, main_tbl.basyo,main_tbl.name, $rs1.jyotai, $rs1.time FROM main_tbl LEFT OUTER JOIN $rs1 ON main_tbl.id = $rs1.id"; ~以下クエリの実行と表示文~ どれも駄目でした。(クエリエラー表示) 因みに結合のみとMAX関数を別々に実行すると表示できることを確認しています。 環境は WinXP Mysql5.0.41 php5.2.3 です。 まだまだ勉強中ですのでよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Oracle SQL 結合の手法について

    以下の条件を複合したSQL文を考えています。 SQLが分かる方、お手数ですがよろしくお願いいたします。 ●TBL_1、TBL_2のJUDGEが共に「OK」である、IDとJUDGEとTBL_2のDATE ◆TBL_1 ID ,JUDGE,DATE 001,OK ,20100101 002,NG ,20100102 ◆TBL_2 ID ,JUDGE,DATE 001,OK ,20130101 002,OK ,20130102 ◆希望検索結果 ID ,JUDGE,DATE 001,OK ,20130101 おそらく結合という処理が必要なのだと思います。 SQLの知識をお持ちでお時間がある方、よろしくお願いいたします。

  • 複数検索時の条件分岐について

    環境:php5、mysql5 条件検索はできるのですが検索状況の違いによる条件分岐について どなたがアドバイスをお願いします。 $sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか WHILE以降を変更する気がするのですがやり方がよくわかりません。 よろしくお願いします。 以下設定 テーブル  :tbl_item [int] フィールド1:item_id [int] フィールド2:cate_id [int] ←他テーブル(名前に変換) フィールド3:item_name [varchar] フィールド4:price [decimal] フィールド5:stock_id [int]   ←他テーブル 条件1:cate_id(プルダウン)を検索条件に加えている時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); 条件2:cate_id(プルダウン)を検索条件に加えていない時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ・ ・ アイテム数 <?= $num_rows ?> 種類 ・ ・ <? WHILE ( $item = mysql_fetch_array( $result ) ) { ?> ・ ・ ・ <? $n ++; } ?>

    • ベストアンサー
    • PHP
  • ■検索時にINDEX(インデックス)がどう役立つのか?

    いつもお世話になっております。 MySQLのカテゴリにて質問をさせて頂きますが、このことに意味はありません。 SQLにおける、INDEXの考え方を知ることができれば良いなと思っております。 SQLについては初心者ですので、分かりやすく教えて頂けると助かります。 では、本題へ。 ------------- あるデータテーブルの検索速度を上げる方法として、 INDEXを設定することもその1つに挙げられるかと思いますが、 あるテーブルにおける、ある列(フィールド)に対しINDEXを設定した場合、 検索時、それはどう利用されるのでしょうか、というのが質問です。 例えば、 会員データベース ・会員番号:id ・年齢:age ※その他、複数のフィールドを持つ、とする。 上記の会員データベースにおいて、 CREATE INDEX idx ON tbl_member(id); という風に、tbl_memberテーブルに対し、 会員番号(id)をINDEXに設定したとします、 idは唯一無二の(ユニークな)データです。 この会員テーブルにおいて、 年齢(age)フィールドをもとに、40歳以上の会員を抽出(検索)したい場合、 INDEX(idが設定されている)はこの検索において、 どういう仕組みで活かされることになるのでしょうか? ageと無関係のidが、どう役に立つのか分からずにいる、ということです。 ネット上で色々調べたのですが、 あるフィールドをINDEXに設定した場合に、 それが検索時にどう活かされるのかについて説明されているページを 私は見つけることができませんでしたので、質問させて頂きました。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL