sql >> Database >  >> RDS >> PostgreSQL

Kun je in postgres de standaardopmaak instellen voor een tijdstempel, per sessie of globaal?

In PostgreSQL is de opmaak van tijdstempels onafhankelijk van opslag. Een antwoord is om to_char . te gebruiken en formatteer de tijdstempel naar het formaat dat je nodig hebt op het moment dat je het nodig hebt, als volgt:

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

Maar als u de standaardopmaak moet instellen:

Wijzig het postgresql-tijdstempelformaat globaal:

Kijk eens naar je tijdzone, voer dit uit als een sql-query:

show timezone
Result: "US/Eastern"

Dus wanneer u current_timestamp afdrukt, ziet u dit:

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

De -04 aan het einde is uw tijdzone ten opzichte van UTC. U kunt uw tijdzone wijzigen met:

set timezone = 'US/Pacific'

Dan:

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07

Let dus op de -07 daar, dat betekent dat we Pacific 7 uur verwijderd zijn van UTC. Hoe laat ik die lelijke tijdzone verdwijnen? Een manier is om gewoon een tabel te maken, het is standaard een tijdstempel zonder tijdzone:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

Als u vervolgens een tijdstempel aan die tabel toevoegt en daaruit selecteert

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

yay, geen tijdzone aan het einde. Maar u wilt meer controle over hoe de tijdstempel standaard wordt weergegeven! Je zou zoiets als dit kunnen doen:

CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

Het is een tekstveld dat u meer controle geeft over hoe het standaard wordt weergegeven wanneer u een select somecolumns from sometable doet . Merk op dat je een string naar een tijdstempel kunt casten:

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

Je zou een current_timestamp kunnen casten naar timestamp die de tijdzone verwijdert:

select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

U kunt de tijdzone als volgt verwijderen:

select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

Maar als je de tijdzone echt terug wilt, kun je dit doen:

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

Je kunt eruit halen wat je wilt met extract:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

En dit monster:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40


  1. Rijen retourneren die niet-alfanumerieke tekens bevatten in SQL Server

  2. Beste manier om tijd (uu:mm) in een database op te slaan

  3. Bereken een lopend totaal in MySQL

  4. Hoe Java Date op Mysql datetime op te slaan met JPA