如何在ORACLE SQL开发人员的2个日期之间获取数据

时间:2018-02-28 15:38:12

标签: sql oracle

我是oracle sql的新手。我想在2个日期之间获取数据。 日期格式为db: 13-DEC-10

这是我写的查询,但它给了我错误。如何进行下一步

select sum(TOTAL_AMOUNT) from table a
where trn_date between
TO_DATE(01-APR-17, 'DD-MON-YYYY') AND TO_DATE(31-MAR-17, 'DD-MON-YYYY') ; 

2 个答案:

答案 0 :(得分:3)

日期没有格式 - 它是stored internally to the database as 7-bytes(表示年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL / Plus,SQL)开发人员,Java等)尝试将它显示给您,即用户,并将其转换为您会发现日期具有格式的有意义(通常是字符串)的内容。

要修复查询,您只需将日期字符串括在单引号中,并使用YY匹配2位数年份格式(否则Oracle会假设格式为{{17 YYYY 1}}是年0017century will not be as you expect):

select sum(TOTAL_AMOUNT)
from   table a
where  trn_date between TO_DATE('01-APR-17', 'DD-MON-YY')
                    AND TO_DATE('31-MAR-17', 'DD-MON-YY'); 

但是,您也可以使用日期文字(并跳过必须匹配日期格式模型):

select sum(TOTAL_AMOUNT)
from   table a
where  trn_date between DATE '2017-04-01'
                    AND DATE '2017-05-31'; 

答案 1 :(得分:1)

或者你可以使用RR格式的年份格式来对抗百年问题,不要忘记保留日期值的引号,你可能更喜欢用绑定变量调用sql:

select sum(TOTAL_AMOUNT) 
  from table a
 where trn_date between
TO_DATE('&date_1', 'DD-MON-RR') AND TO_DATE('&date_2', 'DD-MON-RR') ; -- where date_1 is 31-MAR-17 and date_2 is 01-APR-17, in your case.

我所提到的百年问题:

  

RR日期时间格式元素

     

RR datetime格式元素类似于YY日期时间格式   元素,但它为存储日期提供了额外的灵活性   其他世纪的价值观。 RR datetime格式元素可以让您   存储20世纪的日期在21世纪只指定了   今年的最后两位数字。

     

如果将TO_DATE函数与YY日期时间格式元素一起使用,   然后返回的年份总是与前两位数相同   今年。如果您使用RR datetime格式元素,那么   返回值的世纪根据指定的不同而不同   两位数年份和当前年份的最后两位数字。

     

那是:

     

如果指定的两位数年份是00到49,那么

     

如果当前年份的最后两位数字是00到49,那么   返回年份与当前年份的前两位数相同。

     

如果当前年份的最后两位数字是50到99,那么   返回年份的前2位数字比前2位数字大1   当年的数字。

     

如果指定的两位数年份是50到99,那么

     

如果当前年份的最后两位数字是00到49,那么   返回年份的前2位数字比前2位数字少1   今年。

     

如果当前年份的最后两位数字是50到99,那么   返回年份与当前年份的前两位数相同。