SQL日期函数

时间:2016-04-02 13:23:59

标签: sql database oracle oracle10g sql-date-functions

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

5 个答案:

答案 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)

" *"之间的差距和"来自" ...

感谢。