[英]SQL Server 2012 convert datetime data from varchar to Date portion
在此站点以及其他站点上都进行了很多研究,但是仍然没有有效的解决方案。 我有一列varchar
数据类型,它包含DateTime
数据。 我只需要在Date
类型列中存储Date
部分。 尝试了Cast,Convert和其他功能的不同方式,但仍无法使其正常工作。
基本上我想转换这个
Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)
至
04/26/2016
假设您的“日期和月份”部分始终为3个字符长,则可以这样简单地完成操作:
DECLARE @d VARCHAR(100)='Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)';
SELECT CONVERT(DATE,SUBSTRING(@d,4,12),109);
如果这很容易的话,则必须使用CHARINDEX
查找空白,但我不这么认为...
格式代码109
表示此处的 mon dd yyyy hh:mi:ss:mmmAM (or PM)
详细信息 。
并且请注意,包含语言相关部分的格式是由魔鬼直接发送的,以产生永无止境的痛苦……这在具有不同语言设置的服务器上将不起作用!
Declare @String varchar(max) = 'Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)'
Select cast(Substring(@String,12,4)+Substring(@String,4,7) as date)
退货
2016-04-26
好的,这里您有一个看起来像是伪ISO 8601但不是标准的字段。 第一个问题是:“这是从哪里来的?” 通常,您在标准中没有'Tue'或'GMT'或'(CEST)',并且与格林威治标准时间的偏移量的格式为(+/-)##:## NOT(+/-)# ###。 SQL和许多其他格式可以轻松接受ISO 8601格式的标准化字符串。 此处的简短摘要: https : //www.w3.org/TR/NOTE-datetime
话虽这么说,您只要一点点知道就可以轻松获得想要的东西:
DECLARE
@S VARCHAR(128) = 'Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)'
, @Valid VARCHAR(128)
--Legitimate ISO 8601 string:
SELECT @Valid = RTRIM(LTRIM(REPLACE(STUFF(STUFF(@S, 1, 4, ''), LEN(@S)-12, 12, ':00'), 'GMT', '')))
SELECT @Valid
--Legitimate DateTimeOffset
SELECT CAST(@Valid AS DATETIMEOFFSET)
--Now that I have a legimiate DateTimeOffset I can downconvert easily
SELECT CAST(CAST(@Valid AS DATETIMEOFFSET) AS DATE)
--AND... Now that I have a legimate Date I can format it many different ways
SELECT CONVERT(VARCHAR, CAST(CAST(@Valid AS DATETIMEOFFSET) AS DATE), 101)
这里真正要实现的是使用convert函数对DateTime进行神奇的转换。 但是您可能想知道“如果我希望它看起来与众不同?”。 试试这个页面:
http://www.sql-server-helper.com/tips/date-formats.aspx
尽管我可以解析您的示例,但是只要发现事物似乎是来自字符串的位置,那我就不会大惊小怪。 如果您发现事情没有遵循标准,您应该知道原因。 主要原因是您可能可以使它适用于特定实例,但不能一遍又一遍地重复此模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.