sql >> Database >  >> RDS >> Oracle

Hoe krijg ik deze tijdstempel in het formaat dat ik wil, Oracle SQL?

Zoals @Gordon zei, worden tijdstempels (en datums) niet opgeslagen in een formaat dat u zou herkennen. Oracle gebruikt een interne representatie die u nooit echt hoeft te weten of te onderzoeken (maar het is gedocumenteerd als u in dat soort dingen geïnteresseerd bent) .

Wanneer u een tijdstempel opvraagt, wordt deze weergegeven met behulp van de NLS-instellingen van uw klant, tenzij u een client hebt die deze overschrijft. Ik kan mijn sessie zo instellen dat deze overeenkomt met wat je ziet:

alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

En ik kan het veranderen om te zien wat je wilt zien:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Maar het enige dat u doet, is het converteren van een tijdstempel met tijdzone (dat is wat systimestamp is) naar een string en dan terug naar een tijdstempel. U verliest het tijdzonegedeelte en eventuele fracties van seconden; wat je ook zou kunnen doen met een cast :

select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

U kunt de tijdzone en fractieseconden zien met uw standaard timestamp_tz formaat:

select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

en verander het met een andere alter :

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

Wat niet helemaal relevant is als je het echt hebt over het opslaan van tijdstempels in een tabel, maar laat zien dat er variaties zijn.

Maak in uw tabel het gegevenstype timestamp (of timestamp with time zone of timestamp with local time zone ), en u hoeft zich alleen maar zorgen te maken over het formatteren van de waarde als een tekenreeks voor presentatie aan de eindgebruiker, op het laatst mogelijke moment.

Als je het toch moet weergeven, als het weergaveformaat belangrijk voor je is, gebruik dan to_char() met een expliciet formaatmasker - ga er niet vanuit dat iemand anders die uw zoekopdrachten uitvoert dezelfde NLS-instellingen heeft. Zoals u kunt zien, is het gemakkelijk om deze te wijzigen om de uitvoer te wijzigen. (De meeste clients hebben een manier om u de standaardinstellingen te laten instellen, zodat u niet dezelfde alter hoeft te doen commando's elke keer dat u verbinding maakt; bijv. in SQL Developer, van Extra->Voorkeuren->Database->NLS). Als je altijd hetzelfde formaat wilt tonen, gebruik dan zoiets als:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

die ook laat zien dat de kolomwaarde wordt gefilterd (als een tijdstempel nog steeds) met behulp van een letterlijke tijdstempel.



  1. Oracle:standaardwaarde opgeven voor kolom objecttype

  2. De eenvoudigste manier om meerdere spaties toe te voegen aan een string in MySQL - SPACE()

  3. Neo4j - Creëer een relatie met Cypher

  4. Html / php werkt sql-database niet bij