如何在oracle中提取char中的一天

时间:2016-10-05 09:33:09

标签: sql oracle

我想在以下代码中提取char中的日期:

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);

col DN_WORKING_HOURS.DAY有“星期日”,“星期一”等形式的天数......

这是错的:

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

不知道我做错了什么

1 个答案:

答案 0 :(得分:3)

默认情况下,Day格式元素填充为日期语言中最长日期名称的长度;英语周三为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');