• ベストアンサー

条件式の書き方を教えてください。

unique | day_start | day_end --------+----------------------------+---------------------------- 1 | 2006-06-02 12:49:07.094831 | 2007-01-17 02:00:58.643778 2 | 2006-06-08 12:49:07.122762 | 2007-01-17 02:00:58.647793 3 | 2006-06-08 12:49:07.137901 | 2007-01-17 02:00:58.65177 4 | 2006-06-04 12:49:07.15393 | 2007-01-17 02:00:58.655763 5 | 2006-06-08 12:49:07.181952 | 2007-01-17 02:00:58.65976 6 | 2006-06-08 12:49:07.181952 | 7 | 2006-06-08 12:49:07.181952 | 2007-01-17 02:00:58.65976 上記のようなデータがあるとします。 day_startとday_endの間の日数の平均が知りたいです。 ただし、uniqueが7のレコードのように、 day_endがNULLのレコードもあり、その場合は、そのレコードの日数はday_startから現在日までとしたいです。 select avg(to_date(day_start,'yyyy/mm/dd') - to_date(day_end,'yyyy/mm/dd')) from a ※day_endがNULLのレコードもあり、その場合は、そのレコードの日数はday_startから現在日までとしたいです。 ↑この部分の条件式の書き方が分りません。 ご教示いただけないでしょうか。

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

select avg( case when day_end is null then current_date else to_date(day_end,'yyyy/mm/dd') end - to_date(day_start,'yyyy/mm/dd') ) from a では

myaa_myu
質問者

お礼

ご回答ありがとうございました! できました! SQL文でもCASE文が使えるのですね。。。初めて知りました! ありがとうございました!

その他の回答 (1)

回答No.2

current_dateとcoalesce関数を使えば、容易に書けます。

myaa_myu
質問者

お礼

ご回答ありがとうございます! ご教示いただいたものでSQL文を作成してみましたところ、 select avg(to_date(coalesce(day_start,current_date),'yyyy/mm/dd') - to_date(day_end,'yyyy/mm/dd')) from a で、できました! coalesceというのを初めて知りまして大変勉強になりました。 ありがとうございました!

関連するQ&A

  • JavaScriptで日付の差分を求める方法

    var day1 = new Date("2022/10/14"); var day2 = new Date("2020/06/23"); var termDay = (day2 - day1) / 86400000; これで、日数の差分が求められるんですが、それを「yyyy/mm/dd」にする方法を教えてくください。

  • 条件式について

    access2007です。売上管理のDB作ろうとしています。顧客の〆日が末日でない場合、締切日を超えた時、翌月の請求分として集計・認識させるためにクエリのフィールドに入れる条件式の間違っている部分、または考え方を指摘していただきたいと思います。 伝票に[日付]"yyyy/mm/dd"を入力→[締切日]"dd"は顧客マスタを参照し、クエリーの[締切日]に"dd"を代入。[締切月]には[日付]("dd"のみ)<[締切日]の場合は入力した[日付]のmmをそのまま、[日付]>[締切日]の場合には翌月分という意味でmmに1を加えたものを返す・・というものです。 締切月: IIf(Format([日付],"dd")>[締切日],Format(DateAdd("m",1,[日付]),"mm"),Format([日付],"mm")) これだと、エラーが出てしまいます。 どこがおかしいのでしょうか?

  • 日付取得、計算及び表示コードが動作しません。

    日付取得、計算及び表示コードが動作しません。 下記のコードのどこが間違っているのか、どなたかお分かりですか? このコードでは、今日の日付をサーバから取得し、それから10日後の日付を計算して表示したいです。 $currentdate = .getdate(); $yyyy = $currentdate["year"]; $mm = $currentdate["mon"]; $dd = $currentdate["mday"]; $int_day = 10; $duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); echo "$duedate" また、上記のコードが動作するようになったとして、表示される日付は「2008/06/10」のようになるかと思いますが、これを「2008年06月10日」のように表示させる方法をご存知でしょうか? >$duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); 上記コードを下記のように変更してもだめです。 >$duedate = .date("y年m月d日", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); よろしくお願いします。

    • ベストアンサー
    • PHP
  • プルダウンメニューの値をDBに格納する

    以前、こちらでDBの内容をプルダウンメニューで表示させる処理を教えて頂き 下記のコードで実装する事が出来たのですが <SELECT NAME="DAY"> <?php $sql = "SELECT day FROM date_tbl ORDER BY day;"; $col = pg_query($con, $sql); while($data = pg_fetch_array($col)){ ?> <OPTION VALUE="<?php $data['day'] ?>"><?php echo $data['day'] ?></OPTION> <?php } ?> </SELECT> これを応用し、プルダウンメニューでDBの値を選択し 削除ボタンを押せば、選択した項目をDBから削除しようとしています。 しかし実行しても何も起きず自力での解決が出来なくなってしまったので 再度のご教授願えますでしょうか? 以下は自分が考えた処理です。 $del_day = mb_convert_kana($_POST['DAY_DELETE'], "n", "EUC-JP"); if($del_day){ pg_query($con, "DELETE FROM date_tbl WHERE day = '$del_day'"); } ちなみにDBの構造は下記の通りです。 ---------------------- 名前 | 日付 | 登録日 | ---------------------- SELECT name,TO_CHAR(day, 'yyyy年mm月dd日') AS day,TO_CHAR(record_date, 'yyyy年mm月dd日') AS record_date FROM date_tbl ORDER BY day, record_date;"); ※DBには名前・日付・登録日があり、日付はTO_CHARで 『2007-04-01』⇒『2007年04月01日』という形に整形しています。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • WHERE句でのデータ型について

    お願い致します。 ORACLEのWHERE句に対する疑問点ですが、 カレンダを管理するテーブル(カレンダマスタ)において、条件を指定してデータをSELECTする時にWHERE句に記入するデータ型についてご指導お願いします。 <詳細> 目的としてカレンダマスタよりSYSDATEの年月の休みの日を除く、稼動日数(COUNT)を求めるのが、目的です。 自分で作成した、SQLでは目的を果たしているのですが、WHERE句にTO_CHARを使用し、抽出項目(年月日-DATE型)を指定しているのですが、条件を指定する時は、TO_CHARで指定しても問題は無いのでしょうか? <SQL> SELECT COUNT(TO_NUMBER(休みFLG)) AS 稼動日 FROM カレンダマスタ WHERE 年月日 BETWEEN (TO_DATE(LAST_DAY(ADD_MONTHS(SYSDATE,-1))+1,'YYYY/MM/DD')) AND (TO_CHAR(LAST_DAY(SYSDATE),'YYYY/MM/DD')) AND 休みFLG='0' <補足> 休みFLG='0'は稼動日

  • DATE型カラムのインデックスが効かない

    Oracle初心者です。 以下のような2種類のSQLをSQLPLUSで実行し、 実行計画を取得しました。 end_timeでfilterをかける際に、"TABLE ACCESS FULL"となっており、貼っているインデックスが使われていないことがわかりました。 #これがSQLの遅い主要因と考えています。。。。勘です。 インデックスが活用されていない原因としてはどのようなものが考えられるのでしょうか。 宜しくお願いいたします。 1) set autotrace traceonly select * from t_sample where end_time >= '2009-08-25' and end_time <= '2009-11-26' 2) set autotrace traceonly select * from t_sample where end_time >= to_date('2009-08-25', 'yyyy-mm-dd') and end_time <= to_date('2009-11-26', 'yyyy-mm-dd')

  • ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています

    <エラーメッセージの内容> ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています 開発言語は、java,oracle10g express editionです スケジュールを登録する画面のところの日付のインサートで失敗します。「→」の部分です。 <以下のSQLをSQL/PLUSで実行するとうまくいきます> insert into schedule values(1, 1, '予定1', '予定1です', TO_DATE('2009-06-01 10:00','YYYY/MM/DD HH24:MI:SS') , TO_DATE('2009-06-01 12:00','YYYY/MM/DD HH24:MI:SS'), 'A社', '予定1のコメントです。',1); <問題のソースコード> * スケジュール情報をデータベースに新規保存する public void create(Schedule schedule) { String sql = "insert into " + SCHEDULE_TABLE_NAME + " (id, user_id,subject,content, start_time, end_time, place, comment1, is_publish) values(?,?,?,?,?,?,?,?,?)"; Connection con = null; try { con = createConnection(); con.setAutoCommit(false); int id = getNextId(con, SCHEDULE_TABLE_NAME); PreparedStatement stmt = con.prepareStatement(sql); →stmt.setString(5,toString(schedule.getStartTime())); →stmt.setString(6, toString(schedule.getEndTime())); * 日付を文字列表現(yyyy-MM-dd HH:mm)に変換する private String toString(java.util.Date date) { SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm"); →return "TO_DATE('"+"'"+sd.format(date)+"'"+",'YYYY/MM/DD HH24:MI:SS'"+")"; } ネット、本などでいろいろ調べましたが、わからなかったので、ヒントになることでもいいので、ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • perl 曜日を入れる

    perl初心者です。試行錯誤の連続です・・・ このように ↓ ( )と曜日を追加するにはどうしたら良いでしょう?。 2008/07/05(土) また、変なところもありましたら指摘してください <(_ _)> #-------------------------------------- # 時間 $time = time(); # 範囲日 $day1 = day0($time + (86400 * 2)); $day2 = day0($time + (86400 * 3)); $day3 = day0($time + (86400 * 4)); ### @weeeeek = ('$day1','$day2','$day3','$day4','$day5','$day6'); # 日計算 sub day0{ my $time = shift || time(); my $day0 = $time + (24 * 60 * 60); my ($yyyy, $mm, $dd) = (localtime($day0))[5,4,3]; $yyyy += 1900; $mm += 1; return( sprintf('%4d/%2d/%2d', $yyyy, $mm, $dd) ); } #-------------------------------------- ### @list = ('(日)','(月)','火','水','木','金','土'); ### ( "$mm/$dd + "(" + list + ")" );

    • ベストアンサー
    • Perl
  • 今の自分の年齢を取得するvbaコードが知りたい

    今の自分の年齢を取得するvbaコードが知りたいのですが Sub test1() Dim dtm誕生日 As Date dtm誕生日 = #7/1/1986# MsgBox Format(Date - dtm誕生日, "yyyy/mm/dd") MsgBox DateDiff("yyyy", dtm誕生日, Date) End Sub を作ってみたのですが 違うのが返りました。 DateDiff("yyyy", dtm誕生日, Date) は、30が返ってしまいます。 今日の時点ではまだ29歳なのですが そういう場合どうすればいいでしょうか? 「現在は29歳です」と返したいのですが、 どのようにすればいいでしょうか?

  • 同じSQL文での検索結果が異なる

    visualbasic2005とoracleを使ってデータベース管理ソフトを作っています。 ひとつのデータのフィールドはいくつかあるのですが、 DATAUPLOADというフィールド値をSQL文で検索するときのみ、 土曜日のデータを拾おうとするとなぜか検索をかけるごとに 件数が1件ずつ減っていくという現象が起きています。 他のフィールドや土曜日以外のフィールドの検索の時には そのようなエラーは起こらないのですが、 同じSQL文で検索結果が随時異なってしまう場合には どのような原因が考えられますでしょうか? DATAUPLOAD は'2008/03/12 00:00:00'の形式のDate型データです。 あるDATE(日付)のデータを検索するときに使用しているSQL文は、 SELECT * FROM DATABASE WHERE DATEUPLOAD BETWEEN TO_DATE(' & CStr(Format(DATE, "yyyy/MM/dd")) & 00:00:00','yyyy/MM/dd hh24:mi:ss') AND TO_DATE(' CStr(Format(DATE, "yyyy/MM/dd")) & 23:59:59','yyyy/MM/dd hh24:mi:ss') です。 いろいろとSQL文を変更してみたのですが、 同じエラーが続いています。 何か思い当たることがありましたら 教えていただければと思います。