2017-09-14 5 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_dateval_date의 데이터 유형은 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

감사하지만 이미 올바른 날짜 형식을 사용했습니다. 나는 너무 많은 데이터 세트를 얻는다. 나는 주어진 두 날짜에 데이터베이스의 모든 사용자로부터 데이터 세트를 얻는다. 하지만 나는 % Username % 및 % User-ID %에 삽입 한 사용자의 데이터 세트 만 원합니다. – wenzel267

+0

Cool.Glad out it sort : –

+0

'TO_CHAR (date_value)'는 기본 형식 모델로 세션 매개 변수 인'NLS_DATE_FORMAT'을 사용합니다. 이는 사용자 별 세션 설정이며 일관성 있고 변함없는 것으로 의존해서는 안됩니다 (특히 다른 지역의 사용자가 다른 기본 날짜 형식을 사용하는 국제 조직에서). 형식 마스크를 지정하지 않으면 한 사용자가 날짜 형식을 변경하자마자 쿼리가 중단되며 쿼리가 변경되지 않으므로 디버깅하는 데 어려움을 겪습니다. – 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에 인덱스의 사용을 허용 것이다.