it-swarm-eu.dev

Převeďte časové razítko Unixu na DATETIME v zobrazení

Mám tabulku, která ukládá unixové časové razítko. Při dotazu na toto datum se pokouším převést toto časové razítko na typ datetime v pohledu. Bohužel se mi zdá, že dostanu DATE část.

Tento odkaz popisuje, jak provést převod, ale vyžaduje změnu nls_date_format zahrnout časovou část. Výchozí hodnota aktuálně zobrazuje pouze část data. Potřebuji datum a čas.

Toto řešení bohužel funguje pouze na úrovni relace. Jako vývojář bych raději nemusel utíkat u našeho poskytovatele spravovaných služeb a požádat je, aby změnil hodnotu na úrovni databáze - zejména proto, že to může mít dopad na jiné aplikace.

Existuje způsob, jak lze převést časové razítko (v sql) na datetime bez úpravy systému?

7
Josh Smeaton

výsledek výrazu

to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')

je hodnota datového typu Oracle DATE. Tento typ obsahuje datum a čas. Pokud chcete tuto hodnotu zobrazit uživateli, musíte ji převést na řetězec. Tuto konverzi lze provést pomocí aplikace nebo můžete nechat Oracle převést ji na typ řetězce, jako je tomu v tomto příkladu. Tato automatická konverze na řetězec Oracle VERTAR2 je řízen nls_date_format a některými nastaveními serveru. Pokud chcete, aby vaše zobrazení vrátilo hodnotu VARCHAR2 s vypočítaným datem ve formátu „RRRR-MM-DD HH24: MI: SS“ a nikoli hodnotu DATE, můžete to provést pomocí funkce převodu: výraz

to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND'),'YYYY-MM-DD HH24:MI:SS')

V tomto případě je však vrácená hodnota pohledu VARCHAR2 a ne hodnota DATE.

12
miracle173

Doporučenou praxí je vyhnout se volání funkcí jiných než SQL uvnitř dotazů SQL, protože tato funkce nemusí být univerzálně dostupná - v mém systému neexistuje numtodsinterval funkce - také kvůli dodatečné režii přepínání kontextu z SQL na PL/SQL a poté zpět do SQL pro každý řádek vrácený nebo testovaný, pokud je funkce volána v klauzuli where.

Zde je řešení pouze pro SQL.

TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400

Výsledkem je hodnota Oracle DATE, která obsahuje také ČAS. Pokud se zdá, že při spuštění dotazu nemá TIME, je problém v NLS_DATE_FORMAT nebo v implementaci převodu dat na řetězce do vašeho uživatelského rozhraní. Nezapomeňte udělat TO_CHAR sami s časovou částí ve formátu řetězce, abyste viděli celou hodnotu. např. TO_CHAR (a_date, 'rrrr-mm-dd hh24: mi: ss')

5
user21435

Pro výpočet této hodnoty jsem použil jiné číslo.

select (TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400000) from dbname;

Tento skript mi ​​funguje dobře.

1
bpedroso

Pokud musí být unix_timestamp porovnáno s nějakým časovým obdobím v klauzuli WHERE, je nejlepší převést data na unix_timestamps místo převodu všech unix_timestamp hodnot na data.

Následující řádek například najde řádky s UNIX_TIMESTAMP mezi zadaným počátečním a koncovým datem.

WHERE unix_timestamp BETWEEN
       (:start_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400
       AND 
       (:end_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400

To také umožní použití indexu na UNIX_TIMESTAMP, pokud existuje.

0
user21435