我想在以下代码中提取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)
不知道我做错了什么
答案 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');