2016-10-05 2 views
0

я хотел бы извлечь день в полукокса в следующем коде:как извлечь изо дня в полукокса в оракула

SELECT DN_DETAILS.DN,DN_WORKING_HOURS.DAY, 
     DN_WORKING_HOURS.BEGIN_HOUR, 
     DN_WORKING_HOURS.END_HOUR 
FROM DN_DETAILS 
    JOIN DN_WORKING_HOURS ON DN_DETAILS.DN=DN_WORKING_HOURS.DN 
WHERE DN_WORKING_HOURS.DAY = (SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'Day') FROM DUAL); 

Коль DN_WORKING_HOURS.DAY имеет дни в виде «воскресенье», «понедельник» и т.д. ...

, что случилось с этим:

(SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'Day') FROM DUAL) 

не знаю, что я делаю неправильно

+1

Вы работаете на одном языке ? Что означает 'SELECT TO_CHAR (TO_DATE ('03/10/2016 ',' DD/MM/YYYY '),' Day ') FROM DUAL' фактически показывает вам, что в сеансе выполняется весь запрос? Каким типом данных является столбец 'DAY'? –

+1

DN_WORKING_HOURS.DAY является varchar2? –

+0

день col находится в CHAR, – MoshMosh

ответ

3

По умолчанию Элемент формата дополняется длиной самого длинного имени на языке дат; который на английском языке - среда с 9 символами. Вы можете увидеть отступы с:

select '<'|| to_char(sysdate + level, 'Day') ||'>' from dual connect by level <= 7; 

'<'||TO_CHAR(SYSDATE+LEVEL,'DAY')||'>' 
-------------------------------------- 
<Thursday > 
<Friday > 
<Saturday > 
<Sunday > 
<Monday > 
<Tuesday > 
<Wednesday> 

Вы можете добавить FM format model modifier подавить эти отступы:

select '<'|| to_char(sysdate + level, 'FMDay') ||'>' from dual connect by level <= 7; 

'<'||TO_CHAR(SYSDATE+LEVEL,'FMDAY')||' 
-------------------------------------- 
<Thursday> 
<Friday> 
<Saturday> 
<Sunday> 
<Monday> 
<Tuesday> 
<Wednesday> 

Таким образом, если предположить Day столбец вашей таблицы является varchar2 и не проложенным тоже ваш подзапрос должен быть :

(SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay') FROM DUAL) 

... или как @a_horse_with_no_name упоминалось сделать то же самое без подзапроса:

... 
WHERE DN_WORKING_HOURS.DAY = TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay'); 

Имейте в виду, что имена день являются NLS-зависимыми, так что если это когда-либо может быть запущен в неанглийской среде вы могли бы сделать его более безопасным с:

... 
WHERE DN_WORKING_HOURS.DAY = TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay', 
    'NLS_DATE_LANGUAGE=ENGLISH'); 
+0

спасибо, что помогли !!! – MoshMosh

Смежные вопросы