2017-04-06 5 views
1

werfen Wenn ich versuche, ein Zeichen des Datumsformat einstellen zu werfen bekomme ich einen Fehler sagen: Conversion failed when converting date and/or time from character string ich die folgende Abfrage verwendet,Wie ein Zeichensatz in ein Datumsformat in MS SQL Server

SELECT TOP 1 FileName 
    FROM #myFiles order by 
    cast(
     (SUBSTRING(filename,23,4))+'-'+ 
     (SUBSTRING(filename,28,2))+'-'+ 
     (SUBSTRING(filename,30,2)) as date) 
    desc 

On die folgenden Aufzeichnungen,

sfd_devtracker_back_2017_04_02_094339_4242105.bak 
sfd_devtracker_back_2017_04_03_094339_4242105.bak 
sfd_devtracker_back_2017_04_04_094339_4242105.bak 

Was mache ich hier falsch? Ist mein Datumsformat korrekt?

+0

Nicht sicher, warum Sie es auf ein Datum umwandeln müssen. da es im YYYYMMDD-Format ist und Nullen in der Reihenfolge gefüllt werden, würde nur ein Teil des Strings ausreichen ... 'Reihenfolge nach Teilzeichenfolge (Dateiname, 21,10)' oder 'Reihenfolge nach Teilzeichenfolge (Dateiname, 21,25)' plus, wenn Sie einen ungültigen Datumseintrag haben, bombardiert der sql nicht auf dem Bekehrten. – xQbert

Antwort

3

Eine Option ...

Declare @S varchar(max)='sfd_devtracker_back_2017_04_02_094339_4242105.bak' 

Select try_convert(date,replace(substring(@S,charindex('_20',@S)+1,10),'_','-')) 

Returns

2017-04-02 

Für den Tisch

Declare @YourTable table (FileName varchar(max)) 
Insert Into @YourTable values 
('sfd_devtracker_back_2017_04_02_094339_4242105.bak'), 
('sfd_devtracker_back_2017_04_03_094339_4242105.bak'), 
('sfd_devtracker_back_2017_04_04_094339_4242105.bak') 

Select Top 1 * 
From @YourTable 
Order By try_convert(date,replace(substring(FileName,charindex('_20',FileName)+1,10),'_','-')) Desc 

Returns

sfd_devtracker_back_2017_04_04_094339_4242105.bak 

EDIT Eigentlich keine Notwendigkeit zu konvertieren

Order By substring(FileName,charindex('_20',FileName)+1,10) Desc 
+0

danke @JohnCappelletti. Ich habe es geschafft, meine Aufgabe zu erledigen, ohne mit deiner Hilfe in das Datumsformat zu konvertieren! –

+0

@NisalMalindaLivera Glücklich, es hat geholfen. Nachdem ich es ein zweites Mal angeschaut hatte, dämmerte es mir, dass die Bekehrung nicht nötig war Prost :) –

0

Sie ein wenig auf die Zahlen aus waren bis heute. Hier ist eine andere Option:

SELECT CAST(
    (SUBSTRING('sfd_devtracker_back_2017_04_04_094339_4242105.bak',21,4))+'-'+ 
    (SUBSTRING('sfd_devtracker_back_2017_04_04_094339_4242105.bak',26,2))+'-'+ 
    (SUBSTRING('sfd_devtracker_back_2017_04_04_094339_4242105.bak',29,2)) AS date) DT 
    ,FileName 
ORDER BY DT DESC 
Verwandte Themen