2016-03-31 37 views
2

"01-01-9999" tarihinin oracle tarihi alanına milisaniye almak istiyorum.oracle tarihinden itibaren milisaniye cinsinden nasıl geçeceğine dair tarih 01-01-9999

Aynısını elde etmek için aşağıdaki bloğu oluşturdum.

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; 
/

ama benim tabloda tarih 1/1/2099 ancak gerçek tarihe eşittir ben 4070908800000 olarak değerini alıyorum bloğun, yukarıda kullanarak Tarih alanını

kullanarak kesin milisaniye almak için bize yardım edebilir 01-01-9999

olduğunu

+0

Bu aynı şey [unix zaman Oracle içine damgası veri türü dönüştürme] (http://stackoverflow.com/questions/12105691/convert-timestamp-datatype-into-unix-timestamp-oracle) –

cevap

1

PL/SQL gerek yok, düz SQL içinde yapabilirdiniz. için

01-JAN-1970 itibaren milisaniye için bir tarih dönüştürmek:

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

yanlış değerini alıyorsanız sebebi bu ifadedir. Dönüşüm yılı için sadece 2 rakam olacak to_char yıl için biçim elemanı yana

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 olduğunu.

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 

biçim öğesi olarak YY kullanarak zaman damgası uygulamak için bu dönüştürmek

, yıl hep döndürdü yıl olarak 2099 olsun neden bu yıl, aynı ilk 2 basamak vardır. Hikayenin

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 

Ahlak:

Oracle 4 haneli yıl elemanını (YYYY) kullanmanızı önerir yerine bu nedenlerden dolayı kısa yıl elemanlarının:

  • 4 -diğer yıl elemanı belirsizliği ortadan kaldırır.
  • Daha kısa olan yıl öğeleri sorgu optimizasyonunu etkileyebilir, çünkü yıl sorgu derleme zamanında bilinmez ve yalnızca çalışma zamanında belirlenebilir.