2016-11-15 4 views
0

Wenn ich versuche, diese Abfrage:Wie kann ich double to_char ausführen?

SELECT EQUIPA,COUNT(*) TOTAL, to_char(DATAD, 'YY.MM.DD') Data FROM 
    (
     SELECT EQUIPA, to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') DATAD 

     FROM OS_CRM_DB_FINAL 

     WHERE USERFECHO IS NOT null AND (EQUIPA = 'AAA') AND (to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') >= '16.11.03 17:07') AND (to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') <= '16.11.15 17:07') 

     ORDER BY DATAD DESC 
) GROUP BY EQUIPA, Data 
; 

ich diesen Fehler habe:

  1. 00000 - "invalid number"

Was mache ich falsch? Danke

+1

Sie können nicht - Sie müssen entweder zurück zu einem Datum und dann zurück zu einem Zeichen konvertieren oder Sie müssen eine String-Manipulation an Ihrem String durchführen, um das gewünschte Ergebnis zu erhalten. Ich ziehe das erste dem zweiten vor, nur weil es offensichtlicher ist. – Ben

+1

Der Versuch, eine Zeichenfolge in eine Zeichenfolge zu konvertieren, wird nicht berechnet. Verwenden Sie stattdessen eine Teilzeichenfolge. –

Antwort

1

Ich habe nicht die Richtigkeit der inneren Abfrage überprüft - Sie haben keine Testdaten zur Verfügung gestellt und ich werde nicht meine eigenen erstellen. Aber: Wenn es korrekt ist, müssen Sie nur OS_DATACONCLUSAO in der inneren Abfrage ("Unterabfrage") auswählen, nicht seine Zeichenfolgendarstellung. (Sie verwenden immer noch die Zeichenfolgendarstellung in der WHERE-Klausel, nur nicht in der SELECT.)

Versuchen Sie es und sehen Sie, ob es funktioniert. Dann können wir besprechen, was Sie in der WHERE Klausel haben; es ist wahrscheinlich falsch (Daten sollten nicht als Strings verglichen werden), und selbst wenn es korrekt ist, ist es sehr ineffizient. Um richtig zu vergleichen, sollten Sie die Zeichenfolgen, mit denen Sie vergleichen, in Daten mit to_date() konvertieren, anstatt Ihre Datumswerte in Zeichenfolge zu konvertieren.

1

Sie versuchen, nach data zu gruppieren. Dies ist ein Spaltenalias, der in derselben Abfrageebene definiert ist, sodass ORA-00904: "DATA": invalid identifier generiert wird.

Sie konvertieren ein Datum in eine Zeichenfolge (mit zwei Ziffern Jahren aus irgendeinem Grund) und vergleichen mit einer anderen Zeichenfolge, was sowieso keine gute Idee ist - wenn die Datumsspalte indiziert ist, dann verhindert die Umwandlung in eine Zeichenfolge Index wird für den Vergleich verwendet, und es ist in der Regel sinnvoller und effizienter, den ursprünglichen Datentyp zu vergleichen. Aber die Streicher enden mit verschiedenen Formaten - einer hat Minuten, der andere nicht.

Ihre innere Abfrage konvertiert das Datum in eine Zeichenfolge und ordnet die Ergebnisse an. Das deutet darauf hin, dass es sich um eine vorhandene Abfrage handelt, die Sie jetzt zusammenzufassen versuchen. Die Reihenfolge ist sinnlos und wirkt sich nicht auf die Reihenfolge der Ergebnisse in der äußeren Abfrage aus.

Wenn Sie wirklich in der inneren Abfrage in eine Zeichenfolge halten möchten, können Sie einen Teil verwenden, solange das Datumsformat geeignet ist, und dass die Teilkette in der Verwendungsgruppe-by zu:

SELECT EQUIPA, COUNT(*) TOTAL, substr(DATAD, 1, 8) Data FROM 
    (
     ... -- original inner query 
) GROUP BY EQUIPA, substr(DATAD, 1, 8) 

oder konvertieren zurück auf ein Datum und dann wieder in einen String, und verwenden Sie das konvertierte Datum in der Gruppe-by zu, was mehr Arbeit macht, als Sie brauchen, ist aber logisch, was Sie ursprünglich versucht zu tun:

SELECT EQUIPA, COUNT(*) TOTAL, 
    to_char(to_date(DATAD, 'YY.MM.DD HH24'), 'YY.MM.DD') Data FROM 
    (
    ... -- original inner query 
) GROUP BY EQUIPA, to_date(DATAD, 'YY.MM.DD HH24') 

oder ändern Sie die innere Abfrage, um das ursprüngliche Datum anstelle einer Zeichenfolge zurückzugeben; obwohl die innere Abfrage überhaupt nicht wirklich gebraucht wird:

SELECT EQUIPA, COUNT(*) TOTAL, to_char(TRUNC(OS_DATACONCLUSAO), 'YY.MM.DD') Data 
FROM OS_CRM_DB_FINAL 
WHERE USERFECHO IS NOT null 
AND EQUIPA = 'AAA' 
AND OS_DATACONCLUSAO >= TO_DATE('2016.11.03 17:07:00', 'YYYY.MM.DD HH24:MI:SS') 
AND OS_DATACONCLUSAO <= TO_DATE('2016.11.15 17:07:00', 'YYYY.MM.DD HH24:MI:SS') 
GROUP BY EQUIPA, TRUNC(OS_DATACONCLUSAO) 
ORDER BY EQUIPA, TRUNC(OS_DATACONCLUSAO) DESC 

Ich habe die Filter verändert die Daten als Daten eher als Zeichenfolgen zu vergleichen. Das Datum wird erst im letzten Moment zur Anzeige in eine Zeichenkette umgewandelt. Beachten Sie auch, dass ich nach dem gekürzten Datum sortiert habe (das gibt Ihnen standardmäßig das Datum mit der auf Mitternacht eingestellten Zeit). Sie könnten den Spaltenalias data in der Reihenfolge verwenden (aber nirgendwo anders), und in diesem Fall wäre es in Ordnung; aber wenn Sie das Datum in der Ergebnismenge anders formatiert haben, z. MM/DD/YYYY Sie möchten nach dem Datum und nicht nach der Zeichenfolge sortieren.

Verwandte Themen