2016-09-01 13 views
1
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'); 

注:私は唯一の10日間使用時間

ためperticular期間を必要とする1

エラー: 1.データが存在するが、ゼロを返す親切にこの

を解決するのに役立ち
+0

はい、私はすべての日だけ特定の期間が必要です...この場合、Paid_timeとPaid_dateを使用する必要があります – Selvan

+1

'paid_time'と' paid_date'カラムはどんなタイプですか? Oracleは 'DATE'型を使用して、**結合された日時を保持します。 –

+0

おそらく 'paid_time'は文字列ですか? (日付と時刻を別々の列として保存する必要はなく、必要以上に難しくなります)。だけでなく、データタイプ、(あなたが何のデータか、エラーを取得していない場合には、暗黙の型変換から、決めるように)いくつかのサンプルデータを含めるように役立つこと、そしてまたあなたのNLS_DATE_FORMATでしょう。 –

答えて

0

あなたはそうWHERE'DD/MM/RRRR hh24:mi:ss'が競合して完全な日付と時刻TO_DATEを使用する必要があります。

SELECT * 
FROM mytable 
WHERE paid_time BETWEEN TO_DATE('01/08/2016 00:00:00', 'DD/MM/RRRR hh24:mi:ss') AND TO_DATE('10/08/2016 00:59:59', 'DD/MM/RRRR hh24:mi:ss'); 
0

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のデータのデータ型がそうおそらく、深夜(日付を格納し、時間を含み)、別々の列にある時間は複雑さと非効率性を追加するだけです。

+0

は親切に私のコンセプトは達成可能かではありません知っていますか...?またはどのように行うか... – Selvan

+0

どのコンセプト - 何をするか?私の答えの最後のクエリは、別の列の文字列(と 'paid_date'が実際の日付ではなく文字列として保存されている)として' paid_time'が格納されている場合、あなたが望むもののようです。 –

関連する問題