แยกวันที่ (yyyy / mm / dd) จากการประทับเวลาใน PostgreSQL


250

ฉันต้องการแยกส่วนวันที่จากการประทับเวลาใน PostgreSQL

ฉันต้องการให้เป็นDATEประเภทpostgresql เพื่อให้ฉันสามารถแทรกลงในตารางอื่นที่ต้องการDATEค่า

ตัวอย่างเช่นถ้าฉันมี2011/05/26 09:00:00ฉันต้องการ2011/05/26

ฉันพยายามคัดเลือกนักแสดง แต่ได้รับเพียงปี 2011:

timestamp:date
cast(timestamp as date)

ฉันลองto_char()ด้วยto_date():

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

ฉันพยายามทำให้เป็นฟังก์ชัน:

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

วิธีที่ดีที่สุดในการแยกวันที่ (yyyy / mm / dd) จากการประทับเวลาใน PostgreSQL คืออะไร

คำตอบ:


432

คุณสามารถโยนประทับเวลาของคุณเป็นวันที่โดย suffixing ::dateมันด้วย ที่นี่ใน psql เป็นเวลา:

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

ตอนนี้เราจะส่งมันถึงวันที่:

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

ในทางกลับกันคุณสามารถใช้date_truncฟังก์ชั่น ความแตกต่างระหว่างพวกเขาก็คือหลังจะส่งคืนชนิดข้อมูลเดียวกันเช่นtimestamptzทำให้เขตเวลาของคุณไม่เปลี่ยนแปลง (ถ้าคุณต้องการ)

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

3
ไม่ทำงานลองใช้ "select '2010-01-01 12:00:00' :: timestamp :: date;" . มันกลับมาเพียงปี 2011 ฉันลองวันที่แล้ว (timestamp) และ (timestamp) :: date แต่ฉันได้รับเฉพาะส่วนปีเท่านั้นไม่ใช่วันที่เต็มตามที่ฉันต้องการ
keren

1
@kerenk ตอนนี้มันแปลก คุณลองเป็น psql หรือไม่?
Wayne Conrad

40
@keren, psql เป็นโปรแกรมอรรถประโยชน์บรรทัดคำสั่ง - คุณไม่ได้ใช้มัน (แต่ให้พิจารณาด้วย) เมื่อคุณดำเนินการแบบสอบถามใน pgadmin3 ให้ดูที่บานหน้าต่างเอาต์พุตข้อมูล คุณสามารถปรับขนาดคอลัมน์; ขนาดคอลัมน์เริ่มต้นสั้นเกินไปที่จะแสดงวันที่ทั้งหมดและแสดงเฉพาะปี ใช้เมาส์เพื่อขยายคอลัมน์นั้นและคุณจะเห็นทุกสิ่ง
Wayne Conrad

11
โอ้คุณพูดถูก ฉันรู้สึกงี่เง่า ขอบคุณที่ชี้นำ
keren

กรณีหนึ่งฉันวิ่งเข้าไปในที่นี้ไม่ทำงานอยู่ในกระรอก ด้วยไวยากรณ์นี้ Squirrel จะให้กล่องอินพุตแก่คุณเพื่อป้อนค่าพารามิเตอร์สำหรับพารามิเตอร์ ": date"
James Kingsbery

104

ใช้ฟังก์ชั่นวันที่ :

select date(timestamp_field) from table

จากการแสดงฟิลด์ตัวละครถึงวันที่คุณสามารถใช้:

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

รหัสทดสอบ:

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;

ผลการทดสอบ:

ผลลัพธ์ pgAdmin

pgAdmin ผลกว้าง


1
ฉันได้ลองแล้ว แต่ได้รับผลตอบแทนเพียงปี 2011 แทนที่จะเป็นวันที่เต็มเช่น 2011/05/26
keren

ฉันรู้ว่าคุณไม่ได้ทำงานกับประเภทข้อมูล schedamp แก้ไขเพื่อทำงานกับการแสดงสตริงของการประทับเวลาในรูปแบบที่คุณให้ไว้
James Allman

คุณดำเนินการกับ sql อย่างไร psql?
James Allman

ฉันใช้ pgAdmin III postgresSQL
keren

11
ฉันสังเกตเห็นเมื่อฉันทำการทดสอบใน pgAdmin III คอลัมน์ 'วันที่' กว้างพอที่จะแสดงปี คว้าตัวจัดการคอลัมน์และขยายคอลัมน์เพื่อดูวันที่เต็ม
James Allman

10

คุณพยายามที่จะโยนมันถึงวันที่ด้วย<mydatetime>::date?


1
มันใช้งานได้ดี ดังที่ได้กล่าวไว้ในความคิดเห็นเกี่ยวกับคำตอบของเวย์นคอนราดเคเรนถูกนำไปในทางที่ผิดโดยคอลัมน์ที่แคบเกินไปในบานหน้าต่างเอาท์พุทของ pgAdmin
KenB


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)

ชุดทดสอบอื่น:

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

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

ฉันเพิ่งลองของคุณใน pgAdmin แต่ d มีวันที่ไม่เต็มปี 2011 ซึ่งฉันต้องการ! :(
keren

@keren: สิ่งที่เกี่ยวกับ SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski

บางทีมันอาจจะเกี่ยวข้องกับการจัดรูปแบบค่าผลลัพธ์ ฉันคิดว่าค่าส่งคืนอาจมีวันและเดือนที่นั่น แต่ไม่แสดงในหินกรวด?
keren

พิมพ์ใน SHOW datestyle; เกม me "ISO, DMY"
keren

4

แค่ทำselect date(timestamp_column)แล้วคุณจะได้รับเฉพาะส่วนวันที่ บางครั้งการทำselect timestamp_column::dateอาจส่งคืนในdate 00:00:00ตำแหน่งที่ไม่ได้ถอดชิ้น00:00:00ส่วนออก แต่ฉันได้เห็นdate(timestamp_column)การทำงานอย่างสมบูรณ์แบบในทุกกรณี หวังว่านี่จะช่วยได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.