2015-09-01 4 views
5

है मैं Redshift पर एक एससीडी 2 को लागू करने की कोशिश करने पर मेरी कोशिशों पर रिकॉर्ड डालने की कोशिश कर रहा हूं लेकिन एक त्रुटि प्राप्त करें।कॉलम समय क्षेत्र के बिना टाइमस्टैम्प प्रकार का है लेकिन अभिव्यक्ति प्रकार के चरित्र

लक्ष्य तालिका के DDL

CREATE TABLE ditemp.ts_scd2_test (
    id INT 
    ,md5 CHAR(32) 
    ,record_id BIGINT IDENTITY 
    ,from_timestamp TIMESTAMP 
    ,to_timestamp TIMESTAMP 
    ,file_id BIGINT 
    ,party_id BIGINT 
    ) 

है यह डालने कथन है:

INSERT 
INTO ditemp.TS_SCD2_TEST(id, md5, from_timestamp, to_timestamp) 

SELECT TS_SCD2_TEST_STAGING.id 
    ,TS_SCD2_TEST_STAGING.md5 
    ,from_timestamp 
    ,to_timestamp 
FROM (
    SELECT '20150901 16:34:02' AS from_timestamp 
     ,CASE 
      WHEN last_record IS NULL 
       THEN '20150901 16:34:02' 
      ELSE '39991231 11:11:11.000' 
      END AS to_timestamp 
     ,CASE 
      WHEN rownum != 1 
       AND atom.id IS NOT NULL 
       THEN 1 
      WHEN atom.id IS NULL 
       THEN 1 
      ELSE 0 
      END AS transfer 
     ,stage.* 
    FROM (
     SELECT id 
     FROM ditemp.TS_SCD2_TEST_STAGING 
     WHERE file_id = 2 
     GROUP BY id 
     HAVING count(*) > 1 
     ) AS scd2_count_ge_1 
    INNER JOIN (
     SELECT row_number() OVER (
       PARTITION BY id ORDER BY record_id 
       ) AS rownum 
      ,stage.* 
     FROM ditemp.TS_SCD2_TEST_STAGING AS stage 
     WHERE file_id IN (2) 
     ) AS stage 
     ON (scd2_count_ge_1.id = stage.id) 
    LEFT JOIN (
     SELECT max(rownum) AS last_record 
      ,id 
     FROM (
      SELECT row_number() OVER (
        PARTITION BY id ORDER BY record_id 
        ) AS rownum 
       ,stage.* 
      FROM ditemp.TS_SCD2_TEST_STAGING AS stage 
      ) 
     GROUP BY id 
     ) AS last_record 
     ON (
       stage.id = last_record.id 
       AND stage.rownum = last_record.last_record 
       ) 
    LEFT JOIN ditemp.TS_SCD2_TEST AS atom 
     ON (
       stage.id = atom.id 
       AND stage.md5 = atom.md5 
       AND atom.to_timestamp > '20150901 16:34:02' 
       ) 
    ) AS TS_SCD2_TEST_STAGING 
WHERE transfer = 1 

और छोटी चीजों को करने के लिए, मैं 20150901 16:34:02 को to_timestamp को from_timestamp और 39991231 11:11:11.000 सम्मिलित करने के लिए कोशिश कर रहा हूँ।

और मिल

ERROR: 42804: column "from_timestamp" is of type timestamp without time zone but expression is of type character varying

किसी को भी कृपया इस मुद्दे को हल करने के लिए कैसे बता सकते हैं?

उत्तर

4

पोस्टग्रेस 20150901 16:34:02 (आपका इनपुट) मान्य समय/दिनांक प्रारूप के रूप में पहचान नहीं रहा है, इसलिए यह मानता है कि यह एक स्ट्रिंग है।

इसके बजाय मानक दिनांक प्रारूप का उपयोग करें, अधिमानतः आईएसओ -8601। 2015-09-01T16:34:02

SQLFiddle example

2

शायद ज़रुरत पड़े किसी को यहाँ समाप्त होता है एक PostgreSQL एक timestamp या एक तैयार बयान से ग्रूवी या जावा में एक चर से एक timestampz में डालने के लिए और एक ही त्रुटि मिल रही है की कोशिश कर रहा (मैंने किया था के रूप में), मैं संपत्ति stringtype से "unspecified" पर सेट करके इसे करने में कामयाब रहा। documentation के अनुसार:

प्रकार निर्दिष्ट करें उपयोग करने के लिए जब बाध्यकारी PreparedStatement मापदंडों setString के माध्यम से सेट()। यदि स्ट्रिंगटाइप VARCHAR (डिफ़ॉल्ट) पर सेट है, तो पैरामीटर सर्वर पर वर्चर्स पैरामीटर के रूप में भेजे जाएंगे। यदि स्ट्रिंगटाइप निर्दिष्ट नहीं है, तो पैरामीटर सर्वर पर अवांछित मान के रूप में भेजे जाएंगे, और सर्वर उपयुक्त प्रकार का अनुमान लगाने का प्रयास करेगा। यह उपयोगी है यदि आपके पास मौजूदा अनुप्रयोग है जो पैरामीटर को सेट करने के लिए सेटस्ट्रिंग() का उपयोग करता है जो कि वास्तव में कुछ अन्य प्रकार हैं, जैसे कि पूर्णांक, और आप setInt() जैसी उपयुक्त विधि का उपयोग करने के लिए एप्लिकेशन को बदलने में असमर्थ हैं।

Properties props = [user : "user", password: "password", 
driver:"org.postgresql.Driver", stringtype:"unspecified"] 
def sql = Sql.newInstance("url", props) 
इस संपत्ति सेट के साथ

, आप सवाल शीर्षक में उठाया त्रुटि के बिना एक स्ट्रिंग चर के रूप में एक टाइमस्टैम्प सम्मिलित कर सकते हैं। उदाहरण के लिए:

String myTimestamp= Instant.now().toString() 
sql.execute("""INSERT INTO MyTable (MyTimestamp) VALUES (?)""", 
[myTimestamp.toString()] 

इस तरह, टाइमस्टैम्प के प्रकार (एक स्ट्रिंग से) PostgreSQL द्वारा सही ढंग से अनुमानित है। आशा है कि ये आपकी मदद करेगा।

+1

मेरी मदद की। धन्यवाद। – jeffcook2150

संबंधित मुद्दे