【问题标题】:SQL Server 2012 convert datetime data from varchar to Date portionSQL Server 2012 将日期时间数据从 varchar 转换为日期部分
【发布时间】:2016-11-17 20:27:54
【问题描述】:

在本网站和其他网站上进行了大量研究,但仍然没有有效的解决方案。我有一列varchar 数据类型,它包含DateTime 数据。我只需要将Date 部分存储在Date 类型列中。尝试了 Cast、Convert 和其他功能的不同方式,但仍然无法使其工作。

基本上我想转换这个

Tue Apr 26 2016 13:54:53 GMT+0200 (CEST)

04/26/2016

【问题讨论】:

标签: sql date datetime sql-server-2012


【解决方案1】:

假设您的“日”和“月”部分始终是 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)Details here

请注意,包含语言相关部分的格式是由魔鬼直接发送的,以制造永无止境的痛苦……这在具有不同语言设置的服务器上不起作用!

【讨论】:

  • 好吧,这很有趣......魔鬼的东西
  • @JohnCappelletti 嘿,你已经越过了 10k 的边界!恭喜!
【解决方案2】:
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

【讨论】:

  • 同时得到准确的输出convert(varchar(10),cast(Substring(@String,12,4)+Substring(@String,4,7) as date),101)
  • @Searching 您指出这一点是 100% 正确的。我只是不确定 OP 是否需要日期或字符串。
  • 我同意你的看法。只是不在问题中+我不确定该格式是否甚至可以作为date 类型存储在sqlserver 中。 (转换后的部分)。如果我错了,请纠正我..Ta。
  • @Searching 您可以插入/更新 mm/dd/yyyy 格式的日期字段,但仍以 ISO 格式存储。创建表#temp(日期日期); Insert Into #temp values ('04/26/2016') ;Select * from #temp
  • 是的,这是我的理解.. 它会变成标准格式。
【解决方案3】:

好的,这里有一个看起来是伪 ISO 8601 但不是标准的字段。第一个问题是:“这是从哪里来的?”通常,标准中没有“周二”或“格林威治标准时间”或“(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

尽管我可以解析您的示例,但我会谨慎地发现事物似乎来自字符串的位置。如果你得到的东西不符合标准,你应该知道为什么。主要原因是您可能能够使其适用于特定实例,但无法一遍又一遍地重复此模式。

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多