2

そのタイムスタンプの日付に関係なく、タイムスタンプが2つの時間の間にあるかどうかを判断する方法を探しています。たとえば、タイムスタンプの時間が '00:00:00.000' (真夜中) と '01:00:00.000' (午前 1 時) の間にある場合、特定の日付に関係なくその行を選択したいと思います。

to_charと関数でさまざまなバリエーションを試しましたが、to_dateエラーが発生し続けます。Informix から来た Oracle は、はるかに複雑に見えます。

私が試した「正しい」(と思う)に最も近いものは次のとおりです。

SELECT *
FROM my_table
WHERE SUBSTR(TO_CHAR(my_timestamp), 10) > '00:00:00.000'
AND SUBSTR(TO_CHAR(my_timestamp), 10) < '01:00:00.000'

...しかし、何も機能しません。ヒントやコツはありますか?

私はそれを行う方法を見つけましたが、もし存在するなら、もう少しハッキーなものを好むでしょう。

SUBSTR(SUBSTR(TO_CHAR(my_timestamp), 11), 0, 12) > '01.00.00.000'
4

3 に答える 3

1

TRUNC(my_timestamp, 'J')時間を削除して、「2013-08-15 00:00:00.00」のみを取得するために使用します。そう:

WHERE my_timestamp - TRUNC(my_timestamp, 'J') > 0 
AND my_timestamp - TRUNC(my_timestamp, 'J') < 1/24 ;
于 2013-08-15T21:00:07.097 に答える
0

@kubanczykの回答のバリエーションとして、これらはタイムスタンプであるため、切り捨てられた形式から値を減算すると間隔が得られます。

select systimestamp - trunc(systimestamp) from dual;

SYSTIMESTAMP-TRUNC(SYSTIMESTAMP)
---------------------------------------------------------------------------
+000000000 09:46:46.589795

これはあまり役に立ちません。ただし、例のように常に正確な時間を探している場合は、そこから時間番号を抽出できます。

select extract (hour from systimestamp - trunc(systimestamp)) from dual;

EXTRACT(HOURFROMSYSTIMESTAMP-TRUNC(SYSTIMESTAMP))
-------------------------------------------------
                                                9

したがって、あなたの例では次を使用できます。

SELECT *
FROM my_table
WHERE EXTRACT(HOUR FROM my_timestamp - TRUNC(my_timestamp)) = 0

SQL フィドルのデモ

ただし、タイムスロットが時間と正確に一致している場合にのみ、これは簡単になります。そうしないと、他の要素も抽出する必要があり、ロジックが混乱する可能性があり、@ Ankit のアプローチは全体的にシンプルになります。

于 2013-08-16T08:53:59.750 に答える