【问题标题】:Convert varchar date with text to datetime将带有文本的 varchar 日期转换为日期时间
【发布时间】:2015-01-09 09:28:42
【问题描述】:

我的 SQL 数据库中有一个 varchar(255) 列,其中包含时间戳。我需要将其转换为日期时间格式。但是我不确定哪个演员/转换是合适的。

格式如下:

DDD, DD MMM YYYY HH:MM:SS

数据示例:

Tue, 9 Sep 2014 07:24:25 +0000
Mon, 30 Jun 2014 20:18:19 -0530

第二个 (SS) 数字之后的时区指示符可以忽略。

想要的结果:YYYY-MM-DD HH:MM:SS

【问题讨论】:

  • 这就是为什么你不在 varchar 列中存储日期
  • 正如 Jamiec 所提到的,您应该将日期作为日期存储在数据库中。格式化和显示是应用程序的工作。 UI 方面有很多选项可以在几乎任何平台上执行日期格式化。
  • 我同意,但我对数据库没有所有权:(

标签: sql sql-server date datetime casting


【解决方案1】:

如果您的格式总是这样,您可以使用以下格式

Select convert(datetime, SUBSTRING(DateColumn, CharIndex(',', DateColumn) + 1, LEN(DateColumn) - (CharIndex(',', DateColumn) + 1 + CHARINDEX(':', REVERSE(DateColumn)) - 4))))

这是我的例子:

Declare @val varchar(40) = 'Tue, 9 Sep 2014 07:24:25 +0000'
Declare @val1 varchar(40) = 'Mon, 30 Jun 2014 20:18:19 -0530 (PST)'

Select convert(datetime, substring(@val, CharIndex(',', @val) + 1, Len(@val) - (CharIndex(',', @val) + 1 + CHARINDEX(':', REVERSE(@Val)) - 4))) 
Select convert(datetime, substring(@val1, CharIndex(',', @val1) + 1, Len(@val1) - (CharIndex(',', @val) + 1 + CHARINDEX(':', REVERSE(@Val1)) - 4)))

【讨论】:

  • 我喜欢这种方法,但显然我对样本不够彻底。 'Sun, 14 Dec 2014 08:38:25 -0800 (PST)' 这个也可以出现..
  • 我已经改了。不再修复
  • 其实可以简化一点。但是您的帮助使我找到了解决方案:convert(datetime, SUBSTRING(date,6,20)) Thx!
  • 你可以,但你必须修剪它,因为一天并不总是有前缀 0
【解决方案2】:

使用子字符串提取不同的部分,由于一位或两位数的天数而多取一个字符。 例如。年份部分:trim(substring(col from 12 for 5))

对其余项目执行类似操作。 月份需要额外的工作才能从月份名称中获取月份编号

case trim(substring(col from 8 for 4))
  when 'Jan' then '01'
  when 'Feb' then '02'
  ...
  when 'Dec' then '12'
end

连接你的不同部分,不要忘记分隔破折号等。

【讨论】:

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