2017-06-29 13 views
0

Ich bin mit Sybase IQ und haben als varchar folgendes gespeichert:SQL Varchar zu Datum konvertieren - Sybase

01October 2010 

Ich will das Datum Datentyp mit dem folgenden Format von varchar konvertieren:

yyyy-mm-dd eg.2010-10-01 

Wie würde ich diese SQL-Anweisung schreiben? Danke im Voraus.

+0

Datumsangaben haben kein Format, daher ist der zweite Punkt irrelevant. – Siyual

+0

Sie haben eine Abweichung in Ihrem gewünschten Monat Format (mmm) und Beispieldaten (10); 'mmm' ist die aus drei Buchstaben bestehende Abkürzung für den Monat (z. B. Oct), während Sie anzeigen, dass Sie die zweistellige Zahl (10) möchten; Was willst du? Unabhängig davon, siehe die Funktion (, , ) im IQ-Referenzhandbuch für Details – markp

+0

Ich habe die ursprüngliche Frage aktualisiert. Ich habe die Dokumentation gelesen, kämpfe aber ... Irgendwelche Ideen?Ich habe es versucht: SELECT CONVERT (VARCHAR, visit_date, 106) FROM Tabellenname aber habe diesen Fehler: Datentyp Konvertierung ist nicht möglich. Das Argument CONVERT stimmt nicht mit dem erforderlichen Datentyp überein. –

Antwort

0

Mit Schwierigkeiten. Es gibt einen Grund, warum Sie keine Daten und Zeiten als Zeichenfolgen speichern sollten.

Es ist eine Weile her, seit ich Sybase verwendet habe, aber wir müssen das Feld in das Format YYYY-MM-DD bringen und es dann an die Funktion DATE() oder DATETIME() übergeben.

Nehmen wir an, die ersten beiden Zeichen sind immer der Tag des Monats, und die letzten 4 Zeichen sind das Jahr. Das bedeutet, dass alles dazwischen der Monat ist. Nehmen wir an, dass es keine führenden oder nachgestellten Leerzeichen gibt. Wenn eine dieser Annahmen fehlschlägt, schlägt die Abfrage fehl.

Dann können Sie etwas tun:

SELECT DATE (
     RIGHT(UnnamedField,4) + '-' + 
     CASE LTRIM(RTRIM(SUBSTRING(Unnamed,3,LEN(Unnamed) - 6))) 
      WHEN 'January' THEN '01' 
      WHEN 'February' THEN '02' 
      WHEN 'March' THEN '03' 
      . 
      . 
      . 
      WHEN 'December' THEN '12' 
     END + '-' + LEFT(UnnamedField,2) 
    ) 
FROM UnnamedTable 

Beachten Sie, dass, wie andere schon erwähnt haben, ist das Datum Datentyp nicht formatiert Datentyp. Wenn möglich, sollten Sie es in Ihrer Anwendung formatieren. Wenn Sie dies in der Abfrage tun müssen, verwenden Sie die Funktion CONVERT().

+0

Danke für den Austausch - Ich habe es versucht und NULLs ... Irgendeine Idee warum? –

+0

Ich habe aktualisiert, um alle Leerzeichen zu entfernen: 01Oktober2010 –

+0

@NickEdwards Versuche, die Ausdrücke auseinander zu brechen und zu sehen, was du bekommst. Wählen Sie rechts (UnnamedField, 4) AS Year, LINKS (UnnamedField, 2) AS Day, ... aus, um zu sehen, was jedes Feld macht. Sie erhalten wahrscheinlich NULL, weil einer oder mehrere der Werte einen Nullwert haben. –

0

Sybase kann eine Zeichenfolge in ein Datum konvertieren. Also, wenn Sie substring verwenden, um das Datum in ein Format zu extrahieren, das IQ konvertieren kann, dann können Sie einfach die convert() Funktion verwenden.

Hier ist ein Beispiel dafür, wie es zu tun:

Beispieldaten:

select 
    convert 
    (
     date, 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + substring(col1, 1, 2) -- Day 
      + substring(col1, charindex(' ', col1), 5) -- Year (include the leading space) 
     ) 
    ) 
from #tmp1 

Nun, da der Wert in a:

create table #tmp1 (col1 varchar(100)) 
insert #tmp1 values ('01October 2010') 

Abfrage den Wert zu einem Datum zu konvertieren Datumsformat können Sie die Funktion convert verwenden, um den Datums-Datentyp in das angegebene Format zu konvertieren. Die Standardausgabe für einen Datumsdatentyp ist bereits JJJJ-MM-TT.


Edit: Nach einem Blick auf @BaconBits' Antwort nehmen, habe ich gemerkt, dass ich durch die Verwendung der Teilzeichenfunktion Wrapper left, right und die convert-Wrapper von date die Abfrage ein wenig vereinfachen könnte. Es ist die gleiche Logik; aber die Verwendung der vereinfachten Wrapper könnte das Verständnis erleichtern.

select 
    date 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + left(col1, 2) -- Day 
      + ' ' + right(col1, 4) -- Year (include the leading space) 
     ) 
from #tmp1 
+0

Danke - ich kopiere einfach und klebte das oben und es gibt nichts zurück ... Irgendeine Idee, wo ich falsch liege? –

+0

@NickEdwards Es gab keinen Fehler oder irgendetwas? Es hat nur eine Spalte mit einem leeren Wert zurückgegeben? Es funktioniert gut für mich, wenn ich es teste. Verwenden Sie die Testtabelle, die ich erstellt habe, oder haben Sie sie geändert, um mit Ihren Tabellen zu arbeiten? Wenn Sie meine Testtabelle verwenden, können Sie ein 'select * from # tmp1 'wählen, um sicherzustellen, dass ein Datensatz eingefügt wird? – RToyo

Verwandte Themen