2017-09-14 8 views
2

特定の日に特定のユーザーのテーブルからデータを選択する必要があります。私は自分のコードに何が間違っているか正確にはわかりません。SQLで複数の日付を選択する方法

select k.info, z.mes_user, z.mes_date, m.val_user, m.val_date 
from table_K k 
left join table_M m on k.key1 = m.key1 
left join table_Z z on m.key1 = z.key1 and m.key2 = z.key2 
where (m.val_user like '%Username%' or z.mes_user like '%User-ID%') and 
(
z.mes_date like '%18.04.17%' or 
z.mes_date like '%20.04.17%' or 
m.val_date like '%18.04.17%' or 
m.val_date like '%20.04.17%'); 

間違いがwhere句でpropablyです:

は、ここに私のコードです。

「ユーザー名」と「ユーザーID」は、コードの単なるプレースホルダです。 mes_dateおよびval_dateのデータ型は日付です。

+0

ユーザー名、ユーザーID、日付の変数を作成し、 '='演算子を使用 –

+0

LEFT JOINのときは、右側のテーブル条件をWHEREからONに移動して真のLEFT JOIN結果を取得します。 (今のところ、INNER JOINの結果は定期的に取得されます) – jarlh

+1

'table_M.mes_date'と' table_Z.val_date'カラムのデータ型は何ですか? – Serg

答えて

1

'mes_date'列のタイプがDATEの場合は、次の操作を行うことができます。

まず、日付のフォーマットがデータベーステーブルにどのように格納されているかを確認してください。

SELECT TO_CHAR(mes_date) FROM table_Z; 

次に、フォーマットに基づいてLIKE条件を作成することができます。

SELECT k.info, z.mes_user, z.mes_date, m.val_user, m.val_date 
FROM table_K k 
LEFT JOIN table_M m ON k.key1 = m.key1 
LEFT JOIN table_Z z ON m.key1 = z.key1 AND m.key2 = z.key2 
WHERE (m.val_user LIKE '%Username%' OR z.mes_user LIKE '%User-ID%') AND 
(
z.TO_CHAR(mes_date) LIKE '%your_format%' OR 
z.TO_CHAR(mes_date) LIKE '%your_format%' OR 
z.TO_CHAR(mes_date) LIKE '%your_format%' OR 
z.TO_CHAR(mes_date) LIKE '%your_format%'); 
+0

ありがとうございますが、私はすでに正しい日付形式を使用しています。私はあまりにも多くのデータセットを取得します。私は2つの指定された日付にデータベースのすべてのユーザーからデータセットを取得します。しかし私は、%Username%と%User-ID%に挿入する1人のユーザーのデータセットのみを必要とします。 – wenzel267

+0

Cool.Gladによってソートされました:) –

+0

'TO_CHAR(date_value)'はデフォルトのフォーマットモデルとして 'NLS_DATE_FORMAT'セッションパラメータを使います。これはユーザー単位のセッション設定であり、一貫性と変わらないためには信頼できません(特に、異なる地域のユーザーが異なる既定の日付形式を持つ国際機関の場合)。フォーマットマスクを指定しないと、1人のユーザーが日付形式を変更するとすぐにクエリが破棄され、クエリが変更されないため、デバッグするのが難しくなります。 – MT0

0

あなたは(それらの列がラウンドの日付と仮定)が必要のように見える

select k.info, z.mes_user, z.mes_date, m.val_user, m.val_date 
from table_K k 
left join table_M m on k.key1 = m.key1 and m.val_user like '%Username%' 
left join table_Z z on m.key1 = z.key1 and m.key2 = z.key2 
    and z.mes_user like '%User-ID%' 
    and (z.mes_date in (TO_DATE('18.04.17','dd.mm.yy'), TO_DATE('20.04.17','dd.mm.yy')) 
    or z.val_date in (TO_DATE('18.04.17','dd.mm.yy'), TO_DATE('20.04.17','dd.mm.yy'))); 
+0

'mes_date'が' 2017-04-18T01:23:45'の場合、これは動作しません。 – MT0

+0

@ MT0 definetly。前提を追加しました。あなたの答えは、仮定が成立しない場合の明確な視点を与えます。 – Serg

0

mes_dateval_dateのデータ型が日付です。

TO_CHAR(
    z.mes_date, 
    (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT') 
) like '%18.04.17%' 

NLS_DATE_FORMATセッションパラメータは、ユーザーごとの設定であり、各ユーザによって変更することができる。z.mes_date like '%18.04.17%'を使用

日付に文字列の比較と同じように効果的に実行されます。 NOTには一貫性と不変性があります。あるユーザーが設定を変更して突然クエリを変更せずにクエリが壊れてしまうバグをデバッグすることが非常に難しい道があります。

TRUNC(z.mes_date) IN (DATE '2017-04-18', DATE '2017-04-20') 

しかし、それはz.mes_dateにインデックスを使用できなくなりますし、TRUNC(z.mes_date)上のファンクション索引が必要になります。

優れたソリューションです。

また、使用することができます

(z.mes_date >= DATE '2017-04-18' AND z.mes_date < DATE '2017-04-18' + 1) 
OR (z.mes_date >= DATE '2017-04-20' AND z.mes_date < DATE '2017-04-20' + 1) 

mes_dateのインデックスの使用を許可することになります。

関連する問題