我是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') ;
答案 0 :(得分:3)
日期没有格式 - 它是stored internally to the database as 7-bytes(表示年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL / Plus,SQL)开发人员,Java等)尝试将它显示给您,即用户,并将其转换为您会发现日期具有格式的有意义(通常是字符串)的内容。
要修复查询,您只需将日期字符串括在单引号中,并使用YY
匹配2位数年份格式(否则Oracle会假设格式为{{17
YYYY
1}}是年0017
和century 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,那么 返回年份与当前年份的前两位数相同。