Trích xuất ngày (yyyy / mm / dd) từ dấu thời gian trong PostgreSQL


250

Tôi muốn trích xuất chỉ phần ngày từ dấu thời gian trong PostgreSQL.

Tôi cần nó là một DATEloại postgresql để tôi có thể chèn nó vào một bảng khác mong đợi một DATEgiá trị.

Ví dụ, nếu tôi có 2011/05/26 09:00:00, tôi muốn2011/05/26

Tôi đã thử casting, nhưng tôi chỉ nhận được 2011:

timestamp:date
cast(timestamp as date)

Tôi đã thử to_char()với to_date():

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;

Tôi đã cố gắng để làm cho nó một chức năng:

CREATE OR REPLACE FUNCTION testing() RETURNS void AS '
DECLARE i_date DATE;
BEGIN
    SELECT to_date(to_char(val1, "YYYY/MM/DD"),"YYYY/MM/DD") 
      INTO i_date FROM exampTable WHERE id=1;
    INSERT INTO foo(testd) VALUES (i);
END

Cách tốt nhất để trích xuất ngày (yyyy / mm / dd) từ dấu thời gian trong PostgreSQL là gì?

Câu trả lời:


432

Bạn có thể bỏ dấu thời gian của mình đến một ngày bằng cách thêm nó vào ::date. Ở đây, trong psql, là dấu thời gian:

# select '2010-01-01 12:00:00'::timestamp;
      timestamp      
---------------------
 2010-01-01 12:00:00

Bây giờ chúng tôi sẽ đưa nó đến một ngày:

wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
    date    
------------
 2010-01-01

Mặt khác, bạn có thể sử dụng date_truncchức năng. Sự khác biệt giữa chúng là cái sau trả về cùng một kiểu dữ liệu như timestamptzgiữ nguyên múi giờ của bạn (nếu bạn cần).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)

3
không hoạt động, chỉ cần thử "chọn '2010-01-01 12:00:00' :: timestamp :: date;" . nó trở lại vào năm 2011. Tôi đã thử ngày (dấu thời gian) và (dấu thời gian) :: ngày nhưng tôi chỉ nhận được phần năm mà không phải là ngày đầy đủ mà tôi cần.
keren

1
@kerenk, Bây giờ đó là kỳ quặc. Bạn đã thử nó trong psql?
Wayne Conrad

40
@keren, psql là một tiện ích dòng lệnh - bạn không sử dụng nó (nhưng hãy xem xét nó). Khi bạn thực hiện truy vấn trong pgadmin3, hãy nhìn vào ngăn đầu ra dữ liệu. Bạn có thể thay đổi kích thước các cột; kích thước cột mặc định quá ngắn để hiển thị toàn bộ ngày và chỉ hiển thị năm. Sử dụng chuột để mở rộng cột đó và bạn sẽ thấy toàn bộ.
Wayne Conrad

11
ồ bạn nói đúng tôi cảm thấy thật ngu ngốc. Cảm ơn đã chỉ ra điều đó.
keren

Một trường hợp tôi gặp phải trường hợp này không hoạt động ở Squirrel. Với cú pháp này, Squirrel sẽ cung cấp cho bạn một hộp đầu vào cho các giá trị tham số đầu vào cho tham số ": ngày".
James Kingsbery

104

Sử dụng chức năng ngày :

select date(timestamp_field) from table

Từ một đại diện trường ký tự đến một ngày bạn có thể sử dụng:

select date(substring('2011/05/26 09:00:00' from 1 for 10));

Mã kiểm tra:

create table test_table (timestamp_field timestamp);
insert into test_table (timestamp_field) values(current_timestamp);
select timestamp_field, date(timestamp_field) from test_table;

Kết quả kiểm tra:

kết quả pgAdmin

kết quả pgAdmin rộng


1
Tôi đã thử điều đó nhưng tôi chỉ nhận lại năm 2011 thay vì ngày đầy đủ như 2011/05/26
keren

Tôi nhận ra bạn không làm việc với kiểu dữ liệu thời gian. Sửa đổi để làm việc với một chuỗi đại diện của dấu thời gian theo định dạng bạn cung cấp.
James Allman

Làm thế nào bạn đang thực hiện sql? psql?
James Allman

Tôi đang sử dụng pgAdmin III postgresSQL
keren

11
Tôi nhận thấy khi tôi thực hiện kiểm tra trong pgAdmin III, cột 'ngày' chỉ đủ rộng để hiển thị năm. Lấy tay cầm cột và mở rộng cột để xem ngày đầy đủ.
James Allman

10

Bạn đã cố gắng để đưa nó đến một ngày, với <mydatetime>::date?


1
Điều này chỉ hoạt động tốt. Như đã lưu ý trong các nhận xét về câu trả lời của Wayne Conrad, keren đã bị dẫn dắt lạc lối bởi một cột quá hẹp trong khung đầu ra của pgAdmin.
KenB

9

Điều này làm việc cho tôi trong python 2.7

 select some_date::DATE from some_table;

4
CREATE TABLE sometable (t TIMESTAMP, d DATE);
INSERT INTO sometable SELECT '2011/05/26 09:00:00';
UPDATE sometable SET d = t; -- OK
-- UPDATE sometable SET d = t::date; OK
-- UPDATE sometable SET d = CAST (t AS date); OK
-- UPDATE sometable SET d = date(t); OK
SELECT * FROM sometable ;
          t          |     d      
---------------------+------------
 2011-05-26 09:00:00 | 2011-05-26
(1 row)

Một bộ kiểm tra khác:

SELECT pg_catalog.date(t) FROM sometable;
    date    
------------
 2011-05-26
(1 row)

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)

tôi mới thử cái của bạn trong pgAdmin nhưng tôi chỉ có 2011 không đầy đủ ngày mà tôi cần! :(
keren

@keren: những gì về CHỌN pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski

có lẽ nó có một cái gì đó để làm với định dạng giá trị đầu ra. Tôi đang nghĩ rằng giá trị trả về có thể có ngày và tháng trong đó, nhưng nó chỉ không được hiển thị trên scree?
keren

gõ theo kiểu dữ liệu SHOW; chơi trò chơi "ISO, DMY"
keren

4

Chỉ cần làm select date(timestamp_column)và bạn sẽ nhận được phần ngày duy nhất. Đôi khi làm select timestamp_column::datecó thể trở lại date 00:00:00nơi nó không loại bỏ 00:00:00phần. Nhưng tôi đã thấy date(timestamp_column)để làm việc hoàn hảo trong tất cả các trường hợp. Hi vọng điêu nay co ich.


3

Trong postgres chỉ đơn giản là: TO_CHAR (timestamp_column, 'DD / MM / YYYY') dưới dạng submit_date

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.