PostgreSQL में टाइमस्टैम्प से निकालने की तारीख (yyyy / mm / dd)


250

मैं PostgreSQL में टाइमस्टैम्प से सिर्फ तारीख का हिस्सा निकालना चाहता हूं।

मुझे यह एक पोस्टग्रैस्कल DATEप्रकार की आवश्यकता है ताकि मैं इसे किसी अन्य तालिका में सम्मिलित कर सकूं जो एक 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

PostgreSQL में टाइमस्टैम्प से डेट (yyyy / mm / dd) निकालने का सबसे अच्छा तरीका क्या है?

जवाबों:


432

आप अपने टाइमस्टैम्प को इसके साथ प्रत्यय लगाकर डेट पर ले जा सकते हैं ::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
काम नहीं करता है, बस "2010-01-01 12:00:00 'का चयन करने का प्रयास किया गया है :: टाइमस्टैम्प :: दिनांक;" । यह वर्ष 2011 में वापस आता है। मैंने पहले ही तिथि (टाइमस्टैम्प) और (टाइमस्टैम्प) की कोशिश की थी :: तारीख
केरेन

1
@kerenk, अब यह अजीब है। क्या आपने इसे psql में आज़माया?
वेन कॉनराड

40
@ker, psql एक कमांड-लाइन उपयोगिता है - आप इसका उपयोग नहीं कर रहे हैं (लेकिन इस पर विचार करें)। जब आप pgadmin3 में क्वेरी निष्पादित करते हैं, तो डेटा आउटपुट फलक देखें। आप स्तंभों का आकार बदल सकते हैं; डिफ़ॉल्ट कॉलम का आकार पूरी तारीख दिखाने के लिए बहुत कम है और केवल वर्ष दिखाता है। उस कॉलम का विस्तार करने के लिए अपने माउस का उपयोग करें और आपको पूरी चीज़ देखनी चाहिए।
वेन कॉनराड

11
omg तुम सही हो। मैं इतना बेवकूफ महसूस कर रहा हूं। इस पर ध्यान दिलाने के लिए धन्यवाद।
केरेन

एक मामले में मैं भाग गया, जहां यह काम नहीं करता है गिलहरी में है। इस सिंटैक्स के साथ, गिलहरी आपको पैरामीटर ": दिनांक" के लिए इनपुट पैरामीटर मानों के लिए एक इनपुट बॉक्स देगी।
जेम्स किंग्सबी

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/05/26 की तरह पूरी तारीख के बदले में 2011 मिल रहा है
keren

मुझे महसूस हुआ कि आप टाइमटेम्प डेटा प्रकार के साथ काम नहीं कर रहे हैं। आपके द्वारा प्रदान किए गए प्रारूप में टाइमस्टैम्प के एक स्ट्रिंग प्रतिनिधित्व के साथ काम करने के लिए संशोधित।
जेम्स ऑलमैन

आप वर्ग को कैसे निष्पादित कर रहे हैं? psql?
जेम्स ऑलमैन

मैं pgAdmin III postgresSQL का उपयोग कर रहा हूं
keren

11
मैंने देखा कि जब मैं pgAdmin III में एक परीक्षण करता हूं, तो वर्ष प्रदर्शित करने के लिए 'दिनांक' कॉलम पर्याप्त चौड़ा होता है। कॉलम हैंडल को पकड़ें और पूरी तारीख देखने के लिए कॉलम का विस्तार करें।
जेम्स ऑलमैन

10

क्या आपने इसे किसी तिथि के साथ जोड़ने का प्रयास किया है <mydatetime>::date?


1
यह ठीक काम करता है। जैसा कि वेन कॉनराड के जवाब पर टिप्पणियों में उल्लेख किया गया था, किर्गन को pgAdmin के आउटपुट फलक में एक अत्यधिक संकीर्ण स्तंभ द्वारा भटका दिया गया था।
केनबी

9

यह मेरे लिए अजगर 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)

एक और परीक्षण किट:

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

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

मैंने अभी-अभी pgAdmin में आपकी कोशिश की, लेकिन d के पास केवल 2011 की पूरी तारीख नहीं है, जिसकी मुझे आवश्यकता है! :(
केरेन

@keren: SELECT pg_catalog.date ('2011/05/26 09:00:00') के बारे में क्या; ?
ग्रेज़गोरज़ स्ज़ेटकोव्स्की

शायद इसका आउटपुट मूल्य को स्वरूपित करने के साथ कुछ करना है। मैं सोच रहा हूं कि रिटर्न वैल्यू शायद वहां दिन और महीने में है, लेकिन इसका अभी पता नहीं चला है?
केरेन

SHOW डेटास्टाइल में टाइपिंग; खेल मुझे "आईएसओ, डीएमवाई"
केरेन

4

बस करो select date(timestamp_column)और तुम केवल तारीख हिस्सा मिलेगा। कभी-कभी ऐसा करने से select timestamp_column::dateवह वापस आ सकता है date 00:00:00जहां वह 00:00:00हिस्सा नहीं हटाता है । लेकिन मैंने date(timestamp_column)सभी मामलों में पूरी तरह से काम करते देखा है। उम्मीद है की यह मदद करेगा।


3

सीधे पोस्टग्रेट्स में: TO_CHAR (टाइमस्टैम्प_ कोल्युमेन्ट, 'DD / MM / YYYY') सबडेटडेट के रूप में जमा करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.