2016-03-29 20 views
3

Angenommen, die ich geschaffen habe eine Tabelle und Einfügen von Daten, wie untenWie für jedes Format in SQL

create table datetimefromat 
(
    SlNo int identity, 
    datetimeVarchar varchar(100) 
) 
go 

DECLARE @now datetime 

SET @now = GETDATE() 

insert into datetimefromat (datetimeVarchar) 
values (convert(nvarchar(MAX), @now, 0)), 
     (convert(nvarchar(MAX), @now, 1)), 
     (convert(nvarchar(MAX), @now, 3)), 
     (convert(nvarchar(MAX), @now, 5)), 
     (convert(nvarchar(MAX), @now, 20)), 
     (convert(nvarchar(MAX), @now, 13)), 
     (convert(nvarchar(MAX), @now, 22)), 
     (convert(nvarchar(MAX), @now, 111)); 
go 

select * from datetimefromat 
go 

+------+--------------------------+ 
| SlNo |  datetimeVarchar  | 
+------+--------------------------+ 
| 1 | Mar 29 2016 12:46PM  | 
| 2 | 03/29/16     | 
| 3 | 29/03/16     | 
| 4 | 29-03-16     | 
| 5 | 2016-03-29 12:46:32  | 
| 6 | 29 Mar 2016 12:46:32:087 | 
| 7 | 03/29/16 12:46:32 PM  | 
| 8 | 2016/03/29    | 
+------+--------------------------+ 

Ich will wandeln es wieder normal Datetime

select 
    *, 
    CONVERT(datetime, datetimeVarchar) 
from datetimefromat 

Aber das varchar in Datetime konvertieren verursacht einen Fehler

Msg 242, Stufe 16, Zustand 3, Zeile 11
Die Umwandlung einer VARCHAR Daten ty pe zu einem Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.

Wie kann ich das beheben?

Weil ich will die vorhandenen Datensätze und ändern Sie die varchar Spalte datetime

+4

"Wie kann ich das beheben" - Datum nicht als String an erster Stelle speichern? –

+2

Die Datensätze 2 und 3 werden im Format 'TT/MM/JJ' bzw. 'MM/TT/JJ' gespeichert. Angenommen, Sie hätten diese Abfrage am 4. März ausgeführt, würden sie als '04/03/16 'und '03/04/16' gespeichert. Es gibt keine Möglichkeit für einen Computer herauszufinden, ob dies der 3. März oder der 4. April ist. In der Tat, es gibt keine Möglichkeit für einen Menschen, es zu wissen ...! –

+0

Angenommen, Sie haben keine Kontrolle über die Datenbank (andernfalls speichern Sie keine Daten als Zeichenfolgen, wie Mitch sagte), es ist unmöglich, diese Daten zu korrigieren. Welches Datum würde "03-04-2016" darstellen? 3. April oder 4. März? Wenn Sie nicht wissen können, wie Sie dem SQL-Server erklären, dies zu interpretieren? – HoneyBadger

Antwort

0

Zwei Dinge aktualisieren. Zunächst müssen Sie den Stil angeben, wenn Sie zurück in datetime konvertieren. Zweitens ist 22 kein gültiger Stil.

Dieser Code funktioniert:

CREATE TABLE datetimeformat 
    (SlNo INT IDENTITY, 
    datetimeVarchar VARCHAR(100), 
    datetimeFormat INT); 
GO 

DECLARE @now DATETIME = GETDATE(); 

INSERT INTO 
    datetimeformat (datetimeVarchar, datetimeFormat) 
VALUES 
    (CONVERT(NVARCHAR(MAX), @now, 0), 0), 
    (CONVERT(NVARCHAR(MAX), @now, 1), 1), 
    (CONVERT(NVARCHAR(MAX), @now, 3), 3), 
    (CONVERT(NVARCHAR(MAX), @now, 5), 5), 
    (CONVERT(NVARCHAR(MAX), @now, 20), 20), 
    (CONVERT(NVARCHAR(MAX), @now, 13), 13), 
-- (CONVERT(NVARCHAR(MAX), @now, 22), 22), 
    (CONVERT(NVARCHAR(MAX), @now, 111), 111); 
GO 

SELECT 
    *, 
    CONVERT(DATETIME, datetimeVarchar, datetimeFormat) 
FROM 
    datetimeformat; 
GO 
+0

[MSDN] (https://msdn.microsoft.com/en-za/library/ms187928.aspx) Dokumentation listet die möglichen Stile auf. –

0

Bitte versuchen Sie die folgende Abfrage, diese Hilfe sein können Sie

select CAST((CASE WHEN isdate(datetimeVarchar) = 1 THEN datetimeVarchar 
    ELSE SUBSTRING(datetimeVarchar,4,3)+LEFT(datetimeVarchar,3)+RIGHT(datetimeVarchar,2) 
    END) AS DATETIME) 
from datetimefromat 

Sie die Funktion nutzen können isdate den angegebenen Wert zu überprüfen, ist ein gültiges Datum oder nicht und basierend auf dem Ergebnis-Flag können Sie Ihre eigene Logik erstellen (dh den else-Teil).

SELECT (CASE WHEN ISDATE(datetimeVarchar) = 1 THEN CAST(datetimeVarchar AS DATETIME) 
     ELSE [*Use logic to convert/skip other string values here*] END) 
from datetimefromat