2017-04-06 14 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 
相关问题