Oracle TO_CHAR输出包括BC

时间:2016-08-03 11:43:21

标签: sql oracle to-char

当我跑步时

select *

我没有得到我的约会,因为他们是否定的,我看到了他们:

Select to_char(start_date,'DD/MM/YYYY AD'),s.*
from LIST s
where start_date<to_date('00010101 00:00:00', 'yyyymmdd hh24:mi:ss')
order by s.start_date desc

但它们的写法与22/03/2016 BC

类似

BC来自哪里? 有人知道我的日期有时会变得消极吗? 因为有时他们是正常的&#34;约会,有时他们有BC ...

1 个答案:

答案 0 :(得分:1)

如果你的日期格式模型,无论是明确地还是通过你的NLS_DATE_FORMAT会话参数,都不包括年份的标志或AD / BC指标,那么你就不能区分2016年和 - 2016年一旦成为弦乐。

with t (dt) as (
  select date '2016-03-22' from dual
  union all select date '-2016-03-22' from dual
  union all select date '0001-01-01' from dual
  union all select date '-0001-01-01' from dual
)
select to_char(dt, 'SYYYY-MM-DD') as dt1,
  to_char(dt, 'YYYY-MM-DD') as dt2,
  to_char(dt, 'DD/MM/YYYY') as dt3,
  to_char(dt, 'DD/MM/SYYYY') as dt4, 
  to_char(dt, 'DD/MM/YYYY AD') as dt5
from t;

DT1         DT2        DT3        DT4         DT5         
----------- ---------- ---------- ----------- -------------
 2016-03-22 2016-03-22 22/03/2016 22/03/ 2016 22/03/2016 AD
-2016-03-22 2016-03-22 22/03/2016 22/03/-2016 22/03/2016 BC
 0001-01-01 0001-01-01 01/01/0001 01/01/ 0001 01/01/0001 AD
-0001-01-01 0001-01-01 01/01/0001 01/01/-0001 01/01/0001 BC

请注意,即使实际日期不同,dt2dt3列对于正值和负值对都显示相同。

您的日期值没有变化,您的显示方式如下。他们不会变得消极&#39; - 无论出于何种原因,他们 是否定的,有时你转换它们的字符串就显示出来了。如果您将NLS_DATE_FORMAT更改为'SYYYY-MM-DD',那么select *也会通过使用该NLS参数的隐式转换将其显示为否定。

如果您只想要数据中的AD值,那么您需要调查插入BC(负)值的方式和原因。这与你看到它们的显示方式完全不同。