2017-04-06 15 views
1

當我嘗試投了字符集日期格式我得到一個錯誤的說法,Conversion failed when converting date and/or time from character string我用下面的查詢,如何蒙上了字符集轉換成日期格式的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 

在以下記錄,

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 

我在做什麼錯在這裏?我的日期格式是否正確?

+0

不知道爲什麼你需要將它投射到日期。因爲它的格式是YYYYMMDD,並且通過字符串的一部分來填充零就足夠了......''按字符串排序(文件名,21,10)'或'按子字符串排序(文件名,21,25)'另外如果你有一個無效的日期條目sql不會在轉換器上彈出。 – xQbert

回答

3

一個選項...

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),'_','-')) 

返回

2017-04-02 

對於表格

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 

返回

sfd_devtracker_back_2017_04_04_094339_4242105.bak 

編輯其實,無需轉換迄今爲止

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

謝謝@JohnCappelletti。我設法完成我的任務,而無需在您的幫助下轉換爲日期格式! –

+0

@NisalMalindaLivera對它有幫助。在第二次看了它之後,在我看來,這種轉換並不是必要的歡呼:) –

0

你是一個小關上的數字。這是另一種選擇:

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 
相關問題