2009-05-26 43 views

Trả lời

68

Xin lưu ý rằng định dạng của ngày không phụ thuộc vào bộ nhớ. Nếu điều quan trọng đối với bạn là ngày đó là được lưu trữ ở định dạng đó, bạn sẽ cần xác định loại dữ liệu tùy chỉnh hoặc lưu trữ dưới dạng chuỗi. Sau đó, bạn có thể sử dụng kết hợp của extract, định kiểu và ghép nối để nhận định dạng đó.

Tuy nhiên, tôi nghi ngờ rằng bạn muốn lưu trữ ngày và nhận định dạng trên đầu ra. Vì vậy, một cái gì đó như thế này sẽ làm các trick cho bạn:

CREATE TABLE my_table 
    (
    id serial PRIMARY KEY not null, 
    my_date date not null default CURRENT_DATE 
    ); 

(CURRENT_DATE is basically a synonym for now() and a cast to date). 

(Đã chỉnh sửa sử dụng to_char).

Sau đó, bạn có thể nhận được kết quả của bạn như:

SELECT id, to_char(my_date, 'yyyymm') FROM my_table; 

Bây giờ, nếu bạn đã thực sự cần phải lưu trữ lĩnh vực đó như là một chuỗi và đảm bảo các định dạng mà bạn có thể luôn luôn làm:

CREATE TABLE my_other_table 
(
id serial PRIMARY KEY not null, 
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm') 
); 
8

Tại sao bạn muốn thực hiện việc này?

IMHO bạn nên lưu trữ ngày làm loại mặc định và nếu cần tìm nạp ngày đó thành định dạng mong muốn.

Bạn có thể thoát khỏi việc chỉ định định dạng của cột nhưng với chế độ xem. Tôi không biết các phương pháp khác.

được sửa đổi:

Nghiêm túc, ý kiến ​​của tôi, bạn nên tạo một cái nhìn vào đó một bảng với kiểu ngày. Tôi đang nói về một cái gì đó như thế này:

create table sample_table (id serial primary key, timestamp date); 

và hơn

create view v_example_table as select id, to_char(date, 'yyyymmmm'); 

Và sử dụng v_example_table trong ứng dụng của bạn.

+0

Tôi cần nó. Tôi có một ứng dụng php chạy và truy vấn db với những giá trị đó, 'yyyymm' là '200801', '200802', v.v. để lấy dữ liệu - và tôi thougt rằng có giá trị mặc định sẽ tốt hơn sau đó là SELECT fiels FROM table WHERE column GIỮA timestamp1 AND timestamp2 – Strae

+0

Tôi sẽ làm điều này với giải pháp mà tôi đã thêm vào thư trả lời của tôi. –

-1

Phải. Tốt hơn để sử dụng một chức năng:

CREATE OR REPLACE FUNCTION yyyymm() RETURNS text 
    LANGUAGE 'plpgsql' AS $$ 
DECLARE 
    retval text; 
    m integer; 
BEGIN 
    retval := EXTRACT(year from current_timestamp); 
    m := EXTRACT(month from current_timestamp); 
    IF m < 10 THEN retval := retval || '0'; END IF; 
    RETURN retval || m; 
END $$; 

SELECT yyyymm(); 

DROP TABLE foo; 
CREATE TABLE foo (
    key    int PRIMARY KEY, 
    colname text DEFAULT yyyymm() 
    ); 
INSERT INTO foo (key) VALUES (0); 
SELECT * FROM FOO; 

này mang lại cho tôi

key | colname 
-----+--------- 
    0 | 200905 

Hãy chắc chắn rằng bạn chạy createlang plpgsql từ dòng lệnh Unix, nếu cần thiết.

+0

hoặc làm "tạo ngôn ngữ plpgsql" từ bên trong psql, tất cả đều là createlang. – araqnid

13

Chỉ trong trường hợp Milen A. Radev không nhận được xung quanh để đăng giải pháp của mình, đây là nó:

CREATE TABLE foo (
    key  int PRIMARY KEY, 
    foo  text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM') 
); 
+0

Câu trả lời khác như thế này đã biến mất ở đâu? – Strae

+0

CURRENT_TIMESTAMP :) – zie1ony

1

Cám ơn tất cả những người trả lời, và cảm ơn những người đã cho tôi ý tưởng chức năng định dạng , tôi sẽ thực sự nghiên cứu nó để sử dụng trong tương lai.Tuy nhiên, đối với trường hợp rõ ràng này, 'trường yyyymm đặc biệt' không được coi là trường ngày tháng, nhưng cũng giống như một thẻ, o bất kỳ thứ gì sẽ được sử dụng để khớp chính xác giá trị được nghiên cứu cả năm; có đã là một lĩnh vực ngày, với đầy đủ các dấu thời gian, nhưng nếu tôi cần tất cả các hàng của tháng 1 năm 2008, tôi nghĩ rằng đó là nhanh hơn một lựa chọn như

SELECT [columns] FROM table WHERE yearmonth = '200801' 

thay vì

SELECT [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31') 
0

Đó là một chung quan niệm sai lầm rằng bạn có thể denormalise như thế này cho hiệu suất. Sử dụng date_trunc('month', date) cho các truy vấn của bạn và thêm một biểu thức chỉ mục cho điều này nếu bạn thấy nó chạy chậm.

Các vấn đề liên quan