Sql server 从文件名SQL创建日期

Sql server 从文件名SQL创建日期,sql-server,datetime,Sql Server,Datetime,我有一个带有附件表的数据库。我需要按日期对附件进行排序,将旧数据加上日期放入新表中。 我无权访问文件本身,我想根据文件名在此表中创建日期 所需的输出是YYYY-MM-DD。不担心HH,只需将其设置为0 SELECT CONVERT( DATETIME, CONVERT(VARCHAR(40), '2015-03-20') , 120) 期望输出,如:2015-03-20 00:00:00.000 我最初尝试在文件名上使用左(右)键。但是,由于有时

我有一个带有附件表的数据库。我需要按日期对附件进行排序,将旧数据加上日期放入新表中。 我无权访问文件本身,我想根据文件名在此表中创建日期

所需的输出是YYYY-MM-DD。不担心HH,只需将其设置为0

SELECT CONVERT(
            DATETIME, CONVERT(VARCHAR(40), '2015-03-20')
            , 120)
期望输出,如:2015-03-20 00:00:00.000

我最初尝试在文件名上使用左(右)键。但是,由于有时会出现额外字符或日期格式颠倒,这不起作用。 我曾尝试过一些来自的解决方案,但文件名的不同格式再次使这些解决方案无法工作

----try1:   
GO
DECLARE @S VARCHAR(MAX)

SET @S = '42223_bob_2015-03-20-022535.pdf'
--SET @S = '43661_bill_2015-04-29-113348 (1).pdf'
--SET @S = 'Invoice Revenue By Group-22-05-2017 12:09:27pm.xls'
--SET @S = 'Invoice Revenue By Group-2018-05-11-11-05-37.xls'

SELECT @S AS Filename
       , LEFT(RIGHT(@S,21),10) AS r21_l10
GO

----try2:
DECLARE
@Split CHAR(1)
,@X XML
, @S VARCHAR(MAX)

SET @S = '42223_bob_2015-03-20-022535.pdf'
--SET @S = '43661_bill_2015-04-29-113348 (1).pdf'
--SET @S = 'Invoice Revenue By Group-22-05-2017 12:09:27pm.xls'
--SET @S = 'Invoice Revenue By Group-2018-05-11-11-05-37.xls'

SET @Split = '-'

SELECT
@X = CONVERT(XML,'<root><s>' + REPLACE(@S,@Split,'</s><s>')+'</s></root>')
SET ROWCOUNT 1
SELECT
DateValue
FROM
(SELECT (CASE 
                 WHEN LEN(Value) = 8 AND ISDATE(Value) = 1 
                 THEN CAST(Value AS DATE)
         ELSE NULL
         END) AS DateValue
FROM (
          SELECT T.c.value('.','VARCHAR(MAX)') AS [Value] 
          FROM @X.nodes('/root/s') T (c)
    ) Result1
WHERE ISDATE(Value) = 1
) Result2
WHERE DateValue IS NOT NULL
ORDER BY DateValue DESC
SET ROWCOUNT 0
也许
patindex()
会有帮助。我们找到字符串的位置
#####-#-##
,然后
尝试转换()

如果模式不匹配,则返回空值

示例

Declare @S varchar(200) = '42223_bob_2015-03-20-022535.pdf'

Select try_convert(date,substring(@S,nullif(patindex('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]%',@S),0),10))
返回

2015-03-20
编辑-为备用模式更新


这类方法有效,但只适用于某些场景。请参见场景3第三集。声明@S varchar(200)——SET@S='42223_bob_2015-03-20-022535.pdf'——SET@S='43661_bill_2015-04-29-113348(1).pdf'SET@S='Invoice Revenue By Group-22-05-2017 12:09:27pm.xls'我根据您的回答尝试了另一个选择,但scenrio1也返回了“Date_B”的不希望的结果。选择try_convert(Date,substring(@S,nullif)(patindex('%[0-9][0-9]-[0-9][0-9]%0-9][0-9',@S),0),10))截止日期_B@ClientRelations请参阅编辑以获取备用模式我已尝试将其创建为函数,但该函数不喜欢“SET-DateFormat DMY”。我已编辑原始帖子以包含该函数,是否需要SET-DateFormat DMY?@ClientRelations做得很好!错过了您使用的函数。
2015-03-20
--Declare @S varchar(200) = '42223_bob_2015-03-20-022535.pdf'
Declare @S varchar(200) = 'Invoice Revenue By Group-22-05-2017 12:09:27pm.xls'

Set DateFormat DMY

Select try_convert(date,substring(@S
       ,coalesce(
                 nullif(patindex('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]%',@S),0)
                ,nullif(patindex('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]%',@S),0)
        ),10))