sql >> Databáze >  >> RDS >> PostgreSQL

v postgres, můžete nastavit výchozí formátování pro časové razítko, podle relace nebo globálně?

V PostgreSQL je formátování časových razítek nezávislé na úložišti. Jednou z odpovědí je použít to_char a naformátujte časové razítko do libovolného formátu, který potřebujete v okamžiku, kdy jej potřebujete, takto:

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;

Ale pokud musíte nastavit výchozí formátování:

Globálně změňte formát časového razítka postgresql:

Podívejte se na své časové pásmo, spusťte to jako dotaz SQL:

show timezone
Result: "US/Eastern"

Když tedy tisknete current_timestamp, uvidíte toto:

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

-04 na konci je vaše časové pásmo vzhledem k UTC. Časové pásmo můžete změnit pomocí:

set timezone = 'US/Pacific'

Potom:

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

Všimněte si tedy -07 tam, to znamená, že my Pacific je 7 hodin daleko od UTC. Jak odstraním to nevzhledné časové pásmo? Jedním ze způsobů je prostě vytvořit tabulku, ve výchozím nastavení se použije časové razítko bez časového pásma:

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

Pak pokud do této tabulky přidáte časové razítko a vyberete z něj

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

yay, žádné časové pásmo na konci. Ale chcete mít větší kontrolu nad tím, jak se časové razítko zobrazuje ve výchozím nastavení! Můžete udělat něco takového:

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

Jedná se o textové pole, které vám dává větší kontrolu nad tím, jak se ve výchozím nastavení zobrazí, když select somecolumns from sometable . Všimněte si, že můžete přenést řetězec do časového razítka:

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

Aktuální_časové razítko můžete přenést do timestamp který odstraní časové pásmo:

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

Časového pásma se můžete zbavit takto:

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

Ale pokud opravdu chcete časové pásmo zpět, můžete to udělat takto:

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

Pomocí extraktu můžete vytáhnout, co chcete:

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

A tato zrůdnost:

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


  1. Nelze VYBRAT z klauzule UPDATE RETURNING v postgresu

  2. Seskupené zřetězení v SQL Server

  3. Jak uniknout z jediné citace, speciálních znaků v MySQL

  4. Jaké situace způsobují, že se balíčky Oracle stanou neplatnými?