2012-01-04 25 views
8

Trong Postgres, có thể thay đổi mặt nạ định dạng mặc định cho dấu thời gian không?trong postgres, bạn có thể đặt định dạng mặc định cho dấu thời gian, theo phiên hoặc toàn cầu không?

ngay bây giờ trở lại như

2012-01-03 20:27:53.611489 

tôi muốn giải quyết cho phút như thế này:

2012-01-03 20:27 

Tôi biết tôi có thể làm điều này trên các cột riêng với to_char() as hoặc tước xuống với một substr() bởi ứng dụng nhận, nhưng việc định dạng nó đúng cách ban đầu sẽ tiết kiệm được rất nhiều công việc và giảm rất nhiều lỗi.

+0

mà khách hàng ứng dụng bạn đang sử dụng? –

+0

nguyên mẫu trong php, chuyển sang node.js trong khoảng 6 mo –

+0

Sau đó, đây sẽ là cài đặt php để thay đổi, không phải là cài đặt Postgres. –

Trả lời

4

Trong bưu cục, bạn có thể thay đổi mặt nạ định dạng mặc định cho thời gian biểu - sử dụng tùy chọn set datestyle; các tùy chọn có sẵn có thể được tìm thấy here (xem 8.5.2. Đầu ra Ngày/Giờ).

Thật không may, tất cả các tùy chọn có sẵn bao gồm số giây - do đó bạn sẽ cần phải định dạng lại chúng trong truy vấn hoặc mã ứng dụng (nếu có).

+0

bạn đang tìm thấy những gì tôi tìm thấy - cảm ơn –

3

to_char() được sử dụng để tạo chuỗi chữ. Nếu bạn muốn có một khác nhau timestamp giá trị, sử dụng:

date_trunc('minute', now()) 

Đối với một đầu vào mặt nạ, bạn có thể sử dụng:

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI') 

Cast để timestamp without time zone bằng cách thêm ::timestamp.

Theo hiểu biết của tôi, không có cài đặt trong PostgreSQL có thể cắt giây từ các dấu thời gian theo mặc định.

+0

cảm ơn, nhưng vấn đề không phải là giá trị của dấu thời gian mà là biểu diễn chuỗi của nó khi được chọn. trong ứng dụng này, dấu thời gian được hiển thị cho người dùng luôn được làm tròn đến phút gần nhất - phải làm với màn hình, chứ không phải với dữ liệu. đã tìm kiếm một cách để làm điều này mà không có một 'to_char()' trên mỗi cột của mỗi lựa chọn. –

+1

@ccyoung: Nếu bạn muốn ** vòng ** vào phút gần nhất, 'to_char()' connot cũng giúp bạn. Bạn chỉ có thể cắt ngắn với nó. Dù sao, điều này nghe giống như một công việc cho ** khách hàng **, không phải cho cơ sở dữ liệu. a_horse_with_no_name đang đi đúng hướng. –

+0

về mặt lý thuyết tôi chắc chắn rằng bạn có thể đúng, nhưng như là một vấn đề của thực hành hầu như luôn đặt định dạng ngày và số học trong SQL vì nó tốt hơn nhiều so với javascript hoặc php. –

8

Trong PostgreSQL, Định dạng của dấu thời gian độc lập với bộ nhớ. Một câu trả lời là sử dụng to_char và định dạng dấu thời gian để bất cứ định dạng bạn cần tại thời điểm bạn cần đến nó, như thế này:

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; 

Nhưng nếu bạn phải thiết lập các định dạng mặc định:

Thay đổi postgresql timestamp định dạng toàn cầu:

Hãy xem múi giờ của bạn, chạy như một truy vấn sql:

show timezone 
Result: "US/Eastern" 

Vì vậy, khi bạn đang in ra current_timestamp, bạn thấy điều này:

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

Các -04 ở cuối là múi giờ của bạn so với UTC.Bạn có thể thay đổi múi giờ của bạn với:

set timezone = 'US/Pacific' 

Sau đó:

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

Vì vậy, chú ý đến -07 có, có nghĩa là chúng ta Thái Bình Dương là 7 giờ xa UTC. Làm thế nào để làm cho múi giờ khó coi đó biến mất? Một cách chỉ là làm cho một bảng, nó mặc định là một dấu thời gian mà không cần múi giờ:

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

Sau đó, nếu bạn thêm một dấu thời gian để bảng đó và chọn từ nó

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

yay, không có múi giờ trên kết thúc. Nhưng bạn muốn kiểm soát nhiều hơn cách dấu thời gian hiển thị theo mặc định! Bạn có thể làm một cái gì đó như thế này:

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

Đó là một trường văn bản mà cung cấp cho bạn kiểm soát nhiều hơn như thế nào nó xuất hiện theo mặc định khi bạn làm một select somecolumns from sometable. Chú ý là bạn có thể bỏ một chuỗi để đánh dấu thời gian:

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

Bạn có thể cast một current_timestamp để timestamp mà loại bỏ các múi giờ:

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

Bạn có thể thoát khỏi múi giờ như thế này:

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

Nhưng nếu bạn thực sự muốn múi giờ trở lại, bạn có thể làm điều này:

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

Bạn có thể yank ra những gì bạn muốn với chiết xuất:

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

Và con quái vật này:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST'; 
Result: 2001-02-16 20:38:40 
Các vấn đề liên quan