web-dev-qa-db-fra.com

La colonne est de type timestamp sans fuseau horaire mais l'expression est de type caractère

J'essaie d'insérer des enregistrements lorsque j'essaie d'implémenter un SCD2 sous Redshift .__, mais j'obtiens une erreur.

Le DDL de la table cible est

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
    )

Ceci est la déclaration insert:

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

et pour faire court, j'essaie d'insérer 20150901 16:34:02 dans from_timestamp et 39991231 11:11:11.000 dans to_timestamp.

et obtenir 

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

Quelqu'un peut-il s'il vous plaît suggérer comment résoudre ce problème?

14
user2518751

Postgres ne reconnaît pas 20150901 16:34:02 (votre entrée) comme format de date/heure valide. Il suppose donc que c'est une chaîne.

Utilisez plutôt un format de date standard, de préférence ISO-8601. 2015-09-01T16:34:02

Exemple SQLFiddle

6
alroc

Dans Apache-Tomcat-9.0.7/conf/server.xml

Ajoutez "?stringtype=unspecified" à la fin de l'adresse URL. Par exemple: 

<GlobalNamingResources> 
<Resource name="jdbc/??" auth="Container" type="javax.sql.DataSource"
       ...
       url="jdbc:postgresql://127.0.0.1:5432/Local_DB?stringtype=unspecified"/>
</GlobalNamingResources>
0
Gene