2017-09-14 2 views
0

Ich ändere meine Datenbank (SQL Server) zu Postgres aber die Abfrage, die ich gewohnt bin, funktioniert nicht in Postgres. Join funktioniert nichtJoin Tabelle funktioniert nicht in Postgres

SELECT DISTINCT CONCAT(TOTALIZER_METER_READINGS.date,' ',TOTALIZER_METER_READINGS.time) 
FROM TOTALIZER_METER_READINGS 
JOIN (
SELECT CONCAT(date,' ',MIN(time))::timestamp as mints FROM TOTALIZER_METER_READINGS  
WHERE date = '2017-08-20' 
GROUP BY date, date_part('hour', time)  
)tt 
ON TOTALIZER_METER_READINGS.time = tt.mints AND TOTALIZER_METER_READINGS.date = tt.mints 
ORDER BY 1 ASC 

Der Fehler ist:

ERROR: operator does not exist: time without time zone = timestamp without time zone LINE 8: ON TOTALIZER_METER_READINGS.time = tt.mints AND TOTALIZE... ********** Error **********

Wie kann ich dieses Problem beheben?

+0

Welches Ergebnis erwarten Sie, wenn Sie ein 'Time' Vergleich zu einem 'Zeitstempel'? Sie müssen entweder Ihre Spalte "time" auf einen "timestamp" (aber welches Datum?) Oder Ihren "timestamp" auf einen Wert "time" umstellen. –

+0

Ich habe bereits den Datentyp von Zeit zu Zeitstempel geändert und der Fehler ist immer noch der gleiche –

Antwort

1

Sie müssen die Uhrzeit und das Datum Wert konvertieren, die Sie in verschiedenen Spalten haben (warum?) zu einem einzelnen Zeitstempel, um sich einer Zeitstempelspalte anschließen zu können.

einen time Wert auf einem date Wert Hinzufügen gibt ein timestamp, so können Sie verwenden:

ON (TOTALIZER_METER_READINGS.date + TOTALIZER_METER_READINGS.time) = tt.mints 

Unrelated, aber:

concat() verwendet wird String-Werte verketten, so dass Sie (implizit) konvertiert Ihr Datum & Zeitwerte in eine Zeichenfolge. Es ist in der Regel besser, den richtigen Datentyp zu halten, anstatt alles in einen String umzuwandeln:

select distinct TOTALIZER_METER_READINGS.date + TOTALIZER_METER_READINGS.time 

wird einen richtigen timestamp Wert bewahren Rückkehr eher dann ein text

+0

es wogte! Vielen Dank –

0

nach Ihrer Fehlerzeile, müssen Sie explizite Umwandlung:

SELECT DISTINCT date || ' ' || FORMAT(to_char(TOTALIZER_METER_READINGS.time, 'HH')), 
    TOTALIZER_METER_READINGS.Ia, TOTALIZER_METER_READINGS.Ib, TOTALIZER_METER_READINGS.Ic, 
    TOTALIZER_METER_READINGS.Ineutral, TOTALIZER_METER_READINGS.Iang, TOTALIZER_METER_READINGS.Ibang, 
    TOTALIZER_METER_READINGS.Icang, TOTALIZER_METER_READINGS.Va, TOTALIZER_METER_READINGS.Vb, 
    TOTALIZER_METER_READINGS.Vc,TOTALIZER_METER_READINGS.Vaang, TOTALIZER_METER_READINGS.Vbang, 
    TOTALIZER_METER_READINGS.Vcang,TOTALIZER_METER_READINGS.pftotal 
    FROM TOTALIZER_METER_READINGS 
    JOIN (
    SELECT CONCAT(date,' ',MIN(time))::timestamp as mints FROM TOTALIZER_METER_READINGS  
    WHERE date = '2017-08-20' 
    GROUP BY date, date_part('hour', time)  
)tt 
    ON TOTALIZER_METER_READINGS.time = tt.mints AND TOTALIZER_METER_READINGS.date = tt.mints 
ORDER BY 1 ASC 

concat kehrt Text ...

+0

versuchte es und es hat nicht funktioniert :( –

+0

FEHLER: Operator existiert nicht: Zeit ohne Zeitzone = Zeitstempel ohne Zeitzone LINE 13: ON TOTALIZER_METER_READINGS.time = tt.mints UND TOTALIZE ... ^ HINWEIS: Kein Operator stimmt mit dem angegebenen Namen und Argumenttyp (en) überein Möglicherweise müssen explizite Typumwandlungen hinzugefügt werden –

+0

ah - time? .. not timestamp? .. aber wie willst du CONCAT (Datum, '', MIN (Zeit)) gegen die Zeit vergleichen? .. ist ''2017-09-14 09: 00'' gleich" '09: 00''? wenn ja dann ''2017-09-13 09: 00'' gleich' '09: 00'', aber dann '' 2017-09-14 09: 00'' gleich' '2017-09-13 09: 00'' was ist nicht –