Spalte vom Typ timestamp ohne Zeit-zone, aber Ausdruck vom Typ character
Ich versuche zum einfügen von Datensätzen auf meine zu versuchen, eine SCD2 auf Rotverschiebung
bekomme aber eine Fehlermeldung.
Der Ziel-Tabelle die DDL ist
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
)
Dies ist die insert-Anweisung:
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
und zu kurz, die Dinge, die ich versuche zu legen 20150901 16:34:02
zu from_timestamp
und 39991231 11:11:11.000
zu to_timestamp
.
bekommen und
ERROR: 42804: column "from_timestamp" is of type timestamp without time zone but expression is of type character varying
Kann bitte jemand vorschlagen, wie dieses Problem zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Postgres ist nicht die Anerkennung
20150901 16:34:02
(Ihre Eingabe) als gültige Zeit/Datum-format, so dass es davon ausgegangen, dass es sich um einen string.Verwenden Sie ein standard-Datum-format statt, vorzugsweise ISO-8601.
2015-09-01T16:34:02
SQLFiddle Beispiel
Nur falls jemand hier landet, versuchen zum einfügen in eine postgresql eine
timestamp
oder einetimestampz
aus einer Variablen in groovy oder Java aus einer vorbereiteten Erklärung und immer die gleichen Fehler (wie ich), ich habe es geschafft durch das setzen der Eigenschaftstringtype
zu"unspecified"
. Nach der Dokumentation:Mit dieser Eigenschaft können Sie einen timestamp als string-variable ohne den Fehler ausgelöst wird, in dem Frage-Titel. Zum Beispiel:
Diese Weise, die Art der Zeitstempel (String) abgeleitet ist richtig, die von postgresql. Ich hoffe, das hilft.
Innen apache-tomcat-9.0.7/conf/server.xml
Hinzufügen "
?stringtype=unspecified
" am Ende der url-Adresse.Zum Beispiel: