paid_time
が文字列であれば、あなたのクエリにのみ起因するあなたが強制されている暗黙の型変換に、特定のNLS_DATE_FORMATの設定のために全く動作します:
alter session set nls_date_format = 'RRRR-MM-DD';
with mytable (paid_date, paid_time) as (
select date '2016-08-02', '00:01:02' from dual
)
Select *
from mytable
where paid_time Between to_date('00:00:00','HH24:MI:SS') and to_date('00:59:59','HH24:MI:SS')
and paid_date Between to_date('1/8/2016','DD/MM/RRRR') and
to_date('10/8/2016','DD/MM/RRRR');
no rows selected
alter session set nls_date_format = 'YYYY-MM-DD';
-- same query
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
alter session set nls_date_format = 'DD/MM/RRRR';
-- same query
ORA-01847: day of month must be between 1 and last day of month
が...など
あなたは現在の月の最初にto_date('00:00:59','HH24:MI:SS')
生成した日付のデフォルト設定を行うと、今日実行したときにそれは9月の日付を取得します:
を210
あなたはその後、例えば、文字列は暗黙のうちにあなたのNLS設定を使用して日付に変換されることを意味し、日付とあなたのpaid_time
文字列を、比較しようとしている。
alter session set nls_date_format = 'RRRR-MM-DD';
select to_char(to_date('00:01:02'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(TO_DATE('00
-------------------
2000-01-02 00:00:00
だからあなたのフィルタが本当に行場所を探しています誤った日付に変換時間文字列は、(実際のNLS設定に依存し、多くの値が何らかの設定がエラーになります正確にどの日)、現在の月の最初の日の最初の分です。これはまったく一致することはほとんどありません。それは文字列であり、常に一貫してフォーマットされている場合
して、あなただけの文字列として比較することができます:
with mytable (paid_date, paid_time) as (
select date '2016-08-02', '00:01:02' from dual
)
Select *
from mytable
where paid_time Between '00:00:00' and '00:59:59'
and paid_date Between to_date('1/8/2016','DD/MM/RRRR') and
to_date('10/8/2016','DD/MM/RRRR');
PAID_DATE PAID_TIM
---------- --------
2016-08-02 00:01:02
コメントで述べたように、Oracleのデータのデータ型がそうおそらく、深夜(日付を格納し、時間を含み)、別々の列にある時間は複雑さと非効率性を追加するだけです。
はい、私はすべての日だけ特定の期間が必要です...この場合、Paid_timeとPaid_dateを使用する必要があります – Selvan
'paid_time'と' paid_date'カラムはどんなタイプですか? Oracleは 'DATE'型を使用して、**結合された日時を保持します。 –
おそらく 'paid_time'は文字列ですか? (日付と時刻を別々の列として保存する必要はなく、必要以上に難しくなります)。だけでなく、データタイプ、(あなたが何のデータか、エラーを取得していない場合には、暗黙の型変換から、決めるように)いくつかのサンプルデータを含めるように役立つこと、そしてまたあなたのNLS_DATE_FORMATでしょう。 –