Sql server 从文件名SQL创建日期
我有一个带有附件表的数据库。我需要按日期对附件进行排序,将旧数据加上日期放入新表中。 我无权访问文件本身,我想根据文件名在此表中创建日期 所需的输出是YYYY-MM-DD。不担心HH,只需将其设置为0Sql 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 我最初尝试在文件名上使用左(右)键。但是,由于有时
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))