0

最も近い午前7時の日付を見つける必要があります。今日(00-07AMの場合)または明日(07 AM-12PMの場合)になります。ifステートメントではなく、この「インライン」を実行できるものはありますか?

4

2 に答える 2

1

切り捨てる前に日付を調整できます。sdatereal の代わりにいくつかの偽の値を使用しsysdateます。

alter session set nls_date_format = 'DD/MM/YYYY HH24:MI:SS';

with t as (
    select to_date('01/02/2013 00:00:00') as sdate from dual
    union all select to_date('01/02/2013 06:59:59') from dual
    union all select to_date('01/02/2013 07:00:00') from dual
    union all select to_date('01/02/2013 07:00:01') from dual
    union all select to_date('01/02/2013 23:59:59') from dual
    union all select to_date('02/02/2013 00:00:00') from dual
)
select sdate,
    trunc(sdate + interval '17' hour) + interval '7' hour
from t
order by sdate;

SDATE               TRUNC(SDATE+INTERVA
------------------- -------------------
01/02/2013 00:00:00 01/02/2013 07:00:00
01/02/2013 06:59:59 01/02/2013 07:00:00
01/02/2013 07:00:00 02/02/2013 07:00:00
01/02/2013 07:00:01 02/02/2013 07:00:00
01/02/2013 23:59:59 02/02/2013 07:00:00
02/02/2013 00:00:00 02/02/2013 07:00:00

したがってtrunc(sysdate + interval '17' hour)、07:00:00 より前の場合は今日の真夜中、07:00:00 以降の場合は明日の真夜中となります。次に+ interval '7' hour、最初に解決された日の 07:00:00 にします。

+ 17/24間隔の代わりにandを使用することもできますが+ 7/24、間隔の方が後で誰かが理解しやすいと思います。

これは、正確に 07:00:00 に実行した場合、それが明日と見なされることを前提としています。それが間違っている場合は、1 秒単位で調整できます。

with t as (
    select to_date('01/02/2013 00:00:00') as sdate from dual
    union all select to_date('01/02/2013 06:59:59') from dual
    union all select to_date('01/02/2013 07:00:00') from dual
    union all select to_date('01/02/2013 07:00:01') from dual
    union all select to_date('01/02/2013 23:59:59') from dual
    union all select to_date('02/02/2013 00:00:00') from dual
)
select sdate,
    trunc(sdate + interval '16:59:59' hour to second) + interval '7' hour
from t
order by sdate;

SDATE               TRUNC(SDATE+INTERVA
------------------- -------------------
01/02/2013 00:00:00 01/02/2013 07:00:00
01/02/2013 06:59:59 01/02/2013 07:00:00
01/02/2013 07:00:00 01/02/2013 07:00:00
01/02/2013 07:00:01 02/02/2013 07:00:00
01/02/2013 23:59:59 02/02/2013 07:00:00
02/02/2013 00:00:00 02/02/2013 07:00:00
于 2013-02-01T13:00:45.663 に答える
0

これにより、時間が < 07:00 の場合は今日、それ以外の場合は明日になります。

trunc(sysdate+17/24)

trunc は、日付の時刻部分を削除します。17/24 は、現在の時刻に 17 時間を追加します。

于 2013-02-01T13:00:11.197 に答える