将 text/bad 格式化日期转换为 SQL 可读日期时间
Convert text/bad formatted date to SQL Readable DateTime
我有一个手动输入的日期,看起来像这样:
2016 年 12 月 21 日星期三 19:23:32,servername.domain.name.com,随机字符串的文本转到这里
这很奇怪,我知道,我无法改变他们做事的方式。我的目标是将此日期转换为 SQL 服务器视为日期的任何格式。通过一堆令人作呕的代码,我设法将其归结为:
12 月 21 日 19:38:12 2016 年
substring(LEFT(FIELDVALUE, CHARINDEX(',', FIELDVALUE) - 1),5,LEN(LEFT(FIELDVALUE, CHARINDEX(',', FIELDVALUE) - 1)))
但是现在的问题是时间在day和year之间。
它将始终是 3 位数的月份,space 2 位数的日期,space 8 位数的时间,space 4 位数的年份。
星期一日 HH:MI:SS YYYY
同样,SQL 识别为日期的任何格式都可以使用。我正在将这些字符串导入第二个数据库,并且每次都使用 Excel 宏或其他东西是行不通的。我想象另一个或两个 charindex,我会在那里,但我已经是一团糟我想知道是否有更好的方法来做到这一点。
如果我理解你的问题,你希望从字符串中提取日期并重新格式化。
Declare @String varchar(max)='Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'
Select Try_Convert(datetime,stuff(left(@String,charindex(' ,',@String)),1,4,'') )
Returns
2016-12-21 19:23:32.000
并且使用 Format(), 您可以应用所需的格式
Declare @String varchar(max)='Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'
Select Format(Try_Convert(datetime,stuff(left(@String,charindex(' ,',@String)),1,4,'') ),'MMM dd HH:mm:ss yyyy')
Returns
Dec 21 19:23:32 2016
EDIT - With a table
Declare @YourTable table (FieldName varchar(max))
Insert Into @YourTable values
('Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'),
('Thu Dec 22 17:05:05 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here-and-here')
Select AsDate = Try_Convert(datetime,stuff(left(FieldName,charindex(' ,',FieldName)),1,4,'') )
,Formatted = Format(Try_Convert(datetime,stuff(left(FieldName,charindex(' ,',FieldName)),1,4,'') ),'MMM dd HH:mm:ss yyyy')
From @YourTable
Returns
AsDate Formatted
2016-12-21 19:23:32.000 Dec 21 19:23:32 2016
2016-12-22 17:05:05.000 Dec 22 17:05:05 2016
我有一个手动输入的日期,看起来像这样:
2016 年 12 月 21 日星期三 19:23:32,servername.domain.name.com,随机字符串的文本转到这里
这很奇怪,我知道,我无法改变他们做事的方式。我的目标是将此日期转换为 SQL 服务器视为日期的任何格式。通过一堆令人作呕的代码,我设法将其归结为:
12 月 21 日 19:38:12 2016 年
substring(LEFT(FIELDVALUE, CHARINDEX(',', FIELDVALUE) - 1),5,LEN(LEFT(FIELDVALUE, CHARINDEX(',', FIELDVALUE) - 1)))
但是现在的问题是时间在day和year之间。
它将始终是 3 位数的月份,space 2 位数的日期,space 8 位数的时间,space 4 位数的年份。
星期一日 HH:MI:SS YYYY
同样,SQL 识别为日期的任何格式都可以使用。我正在将这些字符串导入第二个数据库,并且每次都使用 Excel 宏或其他东西是行不通的。我想象另一个或两个 charindex,我会在那里,但我已经是一团糟我想知道是否有更好的方法来做到这一点。
如果我理解你的问题,你希望从字符串中提取日期并重新格式化。
Declare @String varchar(max)='Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'
Select Try_Convert(datetime,stuff(left(@String,charindex(' ,',@String)),1,4,'') )
Returns
2016-12-21 19:23:32.000
并且使用 Format(), 您可以应用所需的格式
Declare @String varchar(max)='Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'
Select Format(Try_Convert(datetime,stuff(left(@String,charindex(' ,',@String)),1,4,'') ),'MMM dd HH:mm:ss yyyy')
Returns
Dec 21 19:23:32 2016
EDIT - With a table
Declare @YourTable table (FieldName varchar(max))
Insert Into @YourTable values
('Wed Dec 21 19:23:32 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here'),
('Thu Dec 22 17:05:05 2016 ,servername.domain.name.com,Random-String-Of-Text-Goes-Here-and-here')
Select AsDate = Try_Convert(datetime,stuff(left(FieldName,charindex(' ,',FieldName)),1,4,'') )
,Formatted = Format(Try_Convert(datetime,stuff(left(FieldName,charindex(' ,',FieldName)),1,4,'') ),'MMM dd HH:mm:ss yyyy')
From @YourTable
Returns
AsDate Formatted
2016-12-21 19:23:32.000 Dec 21 19:23:32 2016
2016-12-22 17:05:05.000 Dec 22 17:05:05 2016