从存储在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