【发布时间】:2017-02-22 20:53:44
【问题描述】:
我有一个数据,其中日期和时间以 yyyymmdd_time (20161012_1528) 格式出现。
我想将其转换为 SQL Server DB 中的日期时间为 2016-10-12 15:28:00:00
是否有任何直接的方法可以做到这一点。或者必须创建一个自定义函数?
【问题讨论】:
标签: sql sql-server tsql datetime sql-server-2014
我有一个数据,其中日期和时间以 yyyymmdd_time (20161012_1528) 格式出现。
我想将其转换为 SQL Server DB 中的日期时间为 2016-10-12 15:28:00:00
是否有任何直接的方法可以做到这一点。或者必须创建一个自定义函数?
【问题讨论】:
标签: sql sql-server tsql datetime sql-server-2014
Declare @String varchar(25) = '20161012_1528'
Select cast(left(@String,8)+' '+Stuff(right(@String,4),3,0,':') as datetime)
或者
Select cast(Stuff(Replace(@String,'_',' '),12,0,':') as datetime)
返回
2016-10-12 15:28:00.000
【讨论】:
请尝试以下方法, 它需要使用一些日期时间和转换函数
declare @dt datetime
declare @str varchar(40) = '20161012_1528'
select @dt =
DATEADD(MI, CAST(right(@str,2) as int),
DATEADD(hh, cast(SUBSTRING(@str,10,2) as int),
CONVERT(datetime, left(@str,8))
)
)
select @dt
【讨论】:
我能找到的最接近的是日期时间格式 112,它不考虑“_hhmm”。我强烈建议只将转换放入您的 T-SQL,因为优化器不能很好地处理 UDF。
T-SQL 看起来像: DECLARE @datetimestring nvarchar(max) = '20161012_1528'
SELECT
dateadd(
minute,convert(
int,substring(
@datetimestring,charindex(
'_',@datetimestring
)+3,2
)
),dateadd(
hour,convert(
int,substring(
@datetimestring,charindex(
'_',@datetimestring
)+1,2
)
),convert(
datetime, substring(
@datetimestring,0,charindex(
'_',@datetimestring
)
), 112
)
)
)
另一种选择是将字符串格式化为更短的预期日期格式。
SELECT
convert(
datetime,replace(
stuff(
stuff(
stuff(
@datetimestring,5,0,'-'
),8,0,'-'
),14,0,':'
),'_',' '
)
)
【讨论】: