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
答案 0 :(得分:1)
我认为原因是当使用'day'
格式选项时,Oracle会将空格填充为'wednesday'
(最长的日期名称)。您可以通过查看是否有效来检查:
where to_char(sdate, 'day') = 'wednesday'
无论如何,我使用缩写形式,因为它更容易输入:
where to_char(sdate, 'dy') = 'mon';
甚至在documentation:
中解释了这种行为填充字符元素MONTH,MON,DAY和DY 尾随空白到最长的完整月份名称的宽度, 最长的缩写月份名称,最长的完整日期名称,或者 最长的缩写日名称,分别在有效名称中 由NLS_DATE_LANGUAGE和NLS_CALENDAR的值确定 参数。
答案 1 :(得分:1)
你应该使用UPPER(to_char(sdate,' fmday'))=' MONDAY'。通常有一个空格填充,显示NO_DATA发现错误。
答案 2 :(得分:0)
您应该将qoutes放在第二个值参数周围,因为它们是varchar类型或将类型更改为整数
答案 3 :(得分:0)
select * from sales where to_char(sdate, 'fmday') = 'monday';
Oracle数据库的设计使得当天的所有拼写都需要相同的空间量。因此,由于长度周三是9,这是所有天中的最大长度,如果其长度小于9,则其他天填充空白()。因此
to_char(sdate, 'fmday')
不返回{{1 (6个字母),但它返回monday
(9个字母,即6个字母加3个额外的空格)。要删除这些额外的空白,您需要使用monday' '
(日期类型格式模型用于删除日期中的其他空格)
答案 4 :(得分:-3)
" *"之间的差距和"来自" ...
感谢。