1

Oracle DB のクエリを作成する正しい方法を探しています。

(dateCol 列の) 一意の日付ごとに、dateCol2 の時刻部分が「17:30」よりも低い最後の行を選択する必要があります。

select * from table where dateCol between to_date('2013-01-01 00:00:00','YYYY-MM-DD H24:MI:SS') and to_date('2013-02-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
and id='myID' 
and [MISSING PART = the last line such that timepart(dateCol2)<'17:30']

私は Oracle/SQL に非常に慣れていないので、私の質問には多くのことが欠けている可能性があります。リクエストがあれば何でも追加します。

編集:これまでのところ、私はこれを理解しました:

  select * from (select table.*, row_number() over (order by dateCol2 desc) last_row from table
  where dateCol between to_date('2013-01-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
                    and to_date('2013-02-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
                    and id='myID' 
                    and to_char(dateCol2, 'hh24:mi') < '17:30')
  where last_row = 1
  group by dateCol
  )
4

4 に答える 4

2

日付のみを保存する場合datecol(つまり、日付を TRUNC に挿入する場合)、その間は必要ありません。そこにもゼロ以外の時間を保存している場合は、その間にも微調整が必​​要です。

時刻を確認するには、日付をフォームの数値に変換しhh24mi(0 から 2359 までの数値になります)、1730 未満であることを確認します。

datecol日付に 00:00:00 以外の時間要素がある場合:

select distinct dateCol 
  from table 
 where dateCol >= to_date('2013-01-01','YYYY-MM-DD') 
   and dateCol < to_date('2013-01-01','YYYY-MM-DD') + 1
   and id='myID' 
   and to_number(to_char(dateCol2, 'hh24mi')) < 1730;

datecol時刻が常に 00:00:00 の日付の場合:

select distinct dateCol 
  from table 
 where dateCol = to_date('2013-01-01','YYYY-MM-DD') 
   and id='myID' 
   and to_number(to_char(dateCol2, 'hh24mi')) < 1730;

明確化から編集

select *
  from (select t.*, row_number() over (partition by datecol 
                                       order by dateCol2) first_row,
               row_number() over (partition by datecol 
                                  order by dateCol2 desc) last_row
          from table t
         where dateCol = to_date('2013-01-01','YYYY-MM-DD') 
           and id='myID' 
           and to_number(to_char(dateCol2, 'hh24mi')) < 1730)
 where first_row = 1
    or last_row = 1;
于 2013-04-03T09:30:26.643 に答える
1

あまりスマートではありませんが、このようにできると思います...

select * from table 
where dateCol between to_date('2013-01-01','YYYY-MM-DD') 
                  and to_date('2013-01-01','YYYY-MMDD') 
and id='myID' and dateCol<trunc(dateCol)+17.5/24
于 2013-04-03T09:44:54.367 に答える