从存储在oracle数据库中的long var char毫秒值中获取日期

我有一个数据库中的日期存储作为varchar中的一个长整型值,例如:1230748200000.我需要从oracle中获取年度数据。如何在Oracle中执行此操作? 有没有一种方法可以将日期转换为日期以便我可以获得年份? 问题是我不能使用to_char(SYSTIMESTAMP,'yyyy')或to_Date,因为我没有时间戳或日期格式的日期...而是让它作为长的varchar

谢谢。

编辑:你可以请给以下方案的解决方案。 我在我的表中有1262284398000保存为var char.so,因为我说我需要得到一年,我使用以下SQL返回2009年

    select 
to_char(
to_date('01-JAN-1970','DD-MM-YYYY HH24:MI SS') + ( 1262284398000 / (1000*60 * 60 * 24) ) ,'YYYY')
from dual ; 

但在java代码中,相同的值返回2010年的日期,因此年份变得不同,

Calendar c = Calendar.getInstance();
  c.setTimeInMillis(1262284398000l);
  System.out.println(c.getTime());
  System.out.println(c.get(Calendar.YEAR)); 

哪个日期返回星期五Jan 01 00:03:18 IST2010为什么这里有区别?


查看更多信息

select epoch_time, extract(year from epoch_time) as year
from (
  select date '1970-01-01' + 1291116794/86400 as epoch_time
  from dual
)

由于我相信时间将以UTC为周期,但是这超出了我的看法,因此可能会出现时区等问题。

此外,它看起来像你的值是13位长而不是10,所以你可能只需要添加一些额外的零,即除以86400000而不是86400。

编辑:正如我上面所说....可能有时区问题。 它看起来像Java代码采取1970-01-01(在UTC,因为它应该是)添加偏移量并将其转换为当地时间。 您还需要在数据库查询中执行此操作。

我对Oracle如何处理时区有点不清楚,但经过一番尝试后,我想出了以下示例

alter session set time_zone = 'Asia/Calcutta';
select 
  sessiontimezone,
  to_char(to_date('01-JAN-1970','DD-MM-YYYY HH24:MI SS') + 
    ( 1262284398000 / (1000*60 * 60 * 24) ) ,'YYYY'),
  extract(year from cast(timestamp '1970-01-01 00:00:00 +00:00' at local + 
    numtodsinterval(1262284398000 / 1000, ' SECOND') as timestamp with time zone)),
  to_char(timestamp '1970-01-01 00:00:00 +00:00' at local + 
    numtodsinterval(1262284398000 / 1000, ' SECOND'), 'YYYY'),
  extract(year from cast(timestamp '1970-01-01 00:00:00 +00:00' at local + 
    numtodsinterval(1262284398000 / 1000, ' SECOND') as timestamp with local time 
    zone))
from dual; 

在上面的例子中,前两列(在sessiontimezone之后)应该是2009年,最后两列应该是2010.尽管这只是通过实验发现的,所以你的里程可能会有所不同。


@MikeyByCrikey发布了一个很好的起点,但在将字符串值转换为日期之前,需要回答几个问题:

A.什么日期以'0'表示? 也就是说,这个毫秒计数值从哪里开始? 在@ Mikey的例子中,使用了1970年1月1日的Unix“开始”日期(也称为'epoch date'),但是在帖子中没有足够的信息来知道'0'日期实际上是什么。 其他系统使用不同的时代日期。 例如,在运行VMS操作系统的系统上,时间日期是1858年11月17日(正好是Julian日2,400,000); Windows(32位和64位版本)使用01年1月1日 - 1601年(公元400年格里历日历周期中的第一年,当该OS设计时是当前日历周期); 和其他计算机系统使用不同的'0'日期。

B.在Oracle中将字符串转换为数字相当容易。 我只使用TO_NUMBER函数,如下所示:

  strMillisecs   VARCHAR2(100) := '1230748200000';
  nMilliseconds  NUMBER;

  nMilliseconds := TO_NUMBER(strMillisecs);

C.一旦你已经到了这一点('0'日期已知,并且字符串被转换为数字),年份可以被提取如下:

  dtEpoch_date         DATE := TO_DATE('01-JAN-1970', 'DD-MON-YYYY');  -- for example
  strMillisecs         VARCHAR2(100) := '1230748200000';
  nMilliseconds        NUMBER;
  dtTarget_date        DATE;
  nYear                NUMBER;
  nMillisecs_in_a_day  NUMBER := 86400000;

  nMilliseconds := TO_NUMBER(strMillisecs);

  -- Note: there are 

  dtTarget_date := dtEpoch_date + (nMilliseconds / nMillisecs_in_a_day);

  -- FINALLY!

  nYear := TO_NUMBER(TO_CHAR(dtTarget_date, 'YYYY'));

希望这是有用的。

分享并享受。


我们希望将存储在数据库中的长整型值转换为中央时区中的TIMESTAMP值。

这工作。

select FROM_TZ(
    TO_TIMESTAMP('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') + 
    NUMTODSINTERVAL( 1386655200000/1000,'SECOND'), 
    'UTC') at time zone 'America/Chicago' 
from dual

其中1386655200000是中央时区中2013年12月10日的java.util.Date的毫秒值。

链接地址: http://www.djcxy.com/p/36937.html

上一篇: Get Date from a long var char milliseconds value stored in oracle Database

下一篇: Oracle cast(timestamp as date)