如何从oracle的date字段获取时间,以01-01-9999为单位

时间:2016-03-31 03:38:44

标签: database oracle oracle11g oracle10g

我想从oracle的日期字段获取毫秒的日期" 01-01-9999"。

我创建了下面的块来实现同样的目标。

set serveroutput on;
declare
    base_point constant timestamp := to_timestamp_tz('01-JAN-1970 00:00:00.000+00:00', 'DD-Mon-RR HH24:MI:SS.FFTZH:TZM') AT TIME ZONE 'UTC';
    now timestamp := to_timestamp_tz('01-01-2099 00:00:00.000+00:00', 'DD-MM-RR HH24:MI:SS.FFTZH:TZM') AT TIME ZONE 'UTC';
    -- now constant timestamp := systimestamp AT TIME ZONE 'UTC' ;
    n number;
begin

  select to_timestamp_tz(to_char(todate,'DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM')
  into now
   from t_table where ACCOUNTID = 'ACC001124211';

 DBMS_OUTPUT.put_line(' now :'||now);

 n := (
                  ((extract(day    from (now-base_point)))*86400)
                + ((extract(hour   from (now-base_point)))*3600)
                + ((extract(minute from (now-base_point)))*60)
                + ((extract(second from (now-base_point))))
           ) * 1000;

           DBMS_OUTPUT.put_line(' n :'||n);
end;
/

但是使用上面的块我得到4070908800000的值,它等于日期1/1/2099但我的表中的实际日期是01-01-9999

你能帮助我们使用日期字段获得精确的毫秒

4 个答案:

答案 0 :(得分:2)

不需要 PL / SQL ,您可以在纯 SQL 中完成。

01-JAN-1970开始将日期转换为毫秒

SQL> SELECT to_number(DATE '9999-01-01'
  2         - to_date('01-JAN-1970','DD-MON-YYYY')) * (24 * 60 * 60 * 1000) milliseconds
  3  FROM dual;

      MILLISECONDS
------------------
   253370764800000

SQL>

答案 1 :(得分:1)

这个陈述是你得错的原因。

select to_timestamp_tz(to_char(todate,'DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM')

由于年份的格式元素为YY,因此to_char转换年份只有2位数。

select to_char(date'9999-01-01','DD-MM-YY HH24:MI:SS')||'.000+00:00'    char_date
from dual

char_date
------------
01-01-99 00:00:00.000+00:00

当您使用YY作为格式元素将其转换为时间戳时,返回的年份始终与当前年份的前2位数字相同,这就是为什么您将获得2099作为年份。

select to_char(to_timestamp_tz(to_char(date'9999-01-01','DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM'),'yyyy') char_date
from dual;

char_date
------------
2099

故事的道德:

由于以下原因,Oracle建议您使用4位年份元素(YYYY)而不是较短的年份元素:

  • 4位年份元素消除了歧义。
  • 较短的年份元素可能会影响查询优化,因为查询编译时不知道年份,只能在运行时确定。

答案 2 :(得分:1)

我已经发布了here一些将时间戳转换为纳秒和将纳秒转换为时间戳的方法。这些方法不受时区的影响,并且具有纳秒级的精度。

您只需将其调整为毫秒而不是纳秒。 您需要使用“ CAST(DATE_HERE AS TIMESTAMP)”将日期转换为时间戳。

SELECT (EXTRACT(DAY FROM (
    CAST(SYSDATE AS TIMESTAMP) --Replace line with desired timestamp --Maximum value: TIMESTAMP '3871-04-29 10:39:59.999999999 UTC'
- TIMESTAMP '1970-01-01 00:00:00 UTC') * 24 * 60) * 60 + EXTRACT(SECOND FROM
    CAST(SYSDATE AS TIMESTAMP) --Replace line with desired timestamp
)) *  1000 AS MILLIS FROM DUAL;

MILLIS
1598447857000

答案 3 :(得分:0)

我的解决方案是双向的::

至今毫厘 True

日期到毫秒(类似于java中的date.getTime()) new_matrix = set() for x in range(len(m)): for y in range(x+1, len(m)): if not set(m[x]).isdisjoint(m[y]): intersection = set(m[x]) & set(m[y]) union = set(m[x]) | set(m[y]) union.remove(*intersection) new_matrix.add(tuple(sorted(union))) else: new_matrix.add(tuple(sorted(m[x]))) new_matrix.add(tuple(sorted(m[y]))) new_a = [x for x in a.split() if x in itertools.chain(*m)] # remove the strings that are not present in the matrix new_b = [x for x in b.split() if x in itertools.chain(*m)] print(all(tuple(sorted(x)) in new_matrix for x in zip(new_a, new_b)))