-1
create table sales
(
     sdate DATE,
     samount varchar2(10)
);

insert into sales values('1-FEB-2016',25000);
insert into sales values('2-FEB-2016',45000);
insert into sales values('3-FEB-2016',25000);
insert into sales values('4-FEB-2016',29000);
insert into sales values('5-FEB-2016',75000);
insert into sales values('6-FEB-2016',90000); 
insert into sales values('7-FEB-2016',38000); 

select 
    to_char(sdate, 'day') 
from sales;

select *
from sales 
where to_char(sdate, 'day') = 'monday';

最后一行有什么问题吗?

显示的输出是找不到数据,而不是 1-FEB-2016 25000

4

5 回答 5

1

我相信原因是在使用'day'格式选项时,Oracle 会放置空格来填充长度'wednesday'(最长的日期名称)。您可以通过查看这是否有效来检查这一点:

where to_char(sdate, 'day') = 'wednesday'

无论如何,我使用缩写形式,因为它更容易输入:

where to_char(sdate, 'dy') = 'mon';

文档中甚至解释了这种行为:

字符元素 MONTH、MON、DAY 和 DY 分别用尾随空格填充到有效名称中最长完整月份名称、最长缩写月份名称、最长完整日期名称或最长缩写日期名称的宽度由 NLS_DATE_LANGUAGE 和 NLS_CALENDAR 参数的值确定。

于 2016-04-02T13:33:37.103 回答
1

您应该使用 UPPER(to_char(sdate,'fmday'))= 'MONDAY'。通常有一个空格填充,它显示 NO_DATA 发现错误。

于 2016-04-02T13:41:47.623 回答
0

您应该在第二个值参数周围放置 qoutes,因为它们是 varchar 类型或将类型更改为整数

于 2016-04-02T13:31:26.350 回答
0
   select * from sales where to_char(sdate, 'fmday') = 'monday';

Oracle 数据库的设计方式是,所有日期的拼写都需要相同数量的空间。因此,由于星期三的长度是 9,这是所有日期中的最大长度,因此如果其他日期的长度小于 9,则用空白 ( ) 填充。所以to_char(sdate, 'fmday')不返回 monday(6 个字母)而是返回monday' '(9 个字母,即6 个字母加上 3 个额外的空格)。要删除您需要使用的那些额外空白fm(用于删除日期中额外空白的日期类型格式模型)

于 2016-04-03T10:18:12.087 回答
-3

“*”和“from”之间的差距...

谢谢。

于 2016-04-02T14:04:55.497 回答