2012-08-21 17 views
6

Czy istnieje sposób na usunięcie precyzji z wyniku funkcji NOW() w PostgreSQL?Usunąć precyzję TIMESTAMP z NOW() spowodować PostgreSQL?

"2012-08-21 10:23:34.867502" 

szukam formacie być:

"2012-08-21 10:23:34" 

mam próby aktualizacji kolumny typu „datownik bez strefy czasowej” z następującym SQL:

UPDATE table SET column = now(); 

Dzięki!

+1

Czy wyrządza jakąkolwiek szkodę? Baza danych powinna po prostu pomijać milisekundy, jeśli typ kolumny ich nie obsługuje. – Crozin

+0

Dobrze to wiedzieć, dziękuję. Nie byłem pewien, czy wpłynie to na cokolwiek. – littleK

Odpowiedz

9
UPDATE tbl SET col = DATE_TRUNC('second', NOW()); 

Zobacz dokumenty dla DATE_TRUNC.

+0

Dziękuję, pilcrow. Przeszukiwałem dokumentację i nie mogłem jej nigdzie znaleźć. Chyba szukałem w niewłaściwym miejscu. – littleK

+0

@littleK W nowym kodzie warto użyć standardowych funkcji SQL 'current_timestamp' itp. Zamiast' NOW() 'lub (gorzej)' 'teraz' :: timestamp'. Zobacz http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT –

14

Prostą odpowiedzią jest rzucenie go do zerowej precyzji.

select now()::timestamptz(0); 
+0

+1 doskonała alternatywa – pilcrow

+0

+ ta metoda utrzymuje strefę czasową – MingalevME

0

W zależności od wymagań, innym rozwiązaniem jest dostosowanie precyzji samej kolumnie timestamp - ustawienie jego dokładność na 0. Może to być przydatne podczas korzystania z PostgreSQL starszych programów, które nie obsługują ułamków sekund w znaczniki czasu .

2

Można zmienić strukturę tabeli IL przesuwania długość kolumny 0 w pgAdmin 3 lub jeśli utworzyć tabelę przy użyciu timestamp (0) tak:

CREATE TABLE public.users 
(
    id integer serial, 
    username character varying(255) NOT NULL, 
    email character varying(255) NOT NULL, 
    password character varying(255) NOT NULL, 
    created_at timestamp(0) without time zone NOT NULL, 
    updated_at timestamp(0) without time zone NOT NULL, 

    CONSTRAINT users_pkey PRIMARY KEY (id) 
); 

Ale jeśli to zrobisz, wystąpi błąd, jeśli spróbujesz wstawić znacznik czasu z milisekundą.