【问题标题】:RFC2822 datetime format to a usable datetime in SQL serverRFC2822 日期时间格式到 SQL 服务器中可用的日期时间
【发布时间】:2021-06-15 18:39:38
【问题描述】:

我收到以下格式的日期时间:

Thu, 18 Mar 2021 10:37:31 +0000

如果我在 RFC2822 中更正了这一点。

我想不出办法将其转换为 SQl 服务器将使用的“正常”日期时间。 例如,我希望它是:

2021-03-18 10:37:31
YYYY-MM-DD hh:mi:ss

我尝试过 CONVERT() 之类的方法,并通过以下方式找到了一个粗略的方法:

DECLARE @WeirdDate varchar(50) = 'Thu, 30 Jul 2015 20:00:00 +0000'
SELECT
CONVERT(DATETIME, SUBSTRING(@WeirdDate, CHARINDEX(',', @WeirdDate) + 1, 20))

但是没有一个效果那么好。 有没有办法以“正确”的方式转换它?

编辑:

澄清: 格式应该始终与提供的示例相同。包括日期名称。

确定它始终是同一个时区。我可能会从不同的时区收到它。这是需要考虑的事情。

【问题讨论】:

  • select parse('Thu, 18 Mar 2021 10:37:31 +0000' as datetimeoffset using 'en-US') 似乎可以工作(或者DATETIME,如果你确定它总是UTC),但需要注意的是这依赖于.NET的“默认”日期/时间解析,它如果您的日期不明确,可能会导致意外。另一种方法是使用 CLR 函数来明确解析它,使用 .NET 中的显式格式说明符。使用“纯”T-SQL 代码对其进行解析在技术上是可行的,但非常没有吸引力(例如,参见 here)。
  • SQL Server 版本?
  • 我猜上面建议的 .NET 解决方案是最好的解决方案……我看不出任何会失败的情况。但我建议在 (.NET) 代码中解析此类数据。

标签: sql sql-server tsql datetime rfc2822


【解决方案1】:

可以通过“小”字符串操作来实现这一点,并且一些样式代码:

DECLARE @YourDate varchar(50) = 'Thu, 30 Jul 2015 20:00:00 +0000'
SELECT TRY_CONVERT(datetimeoffset(0),CONVERT(varchar(25),TRY_CONVERT(datetime2(0),STUFF(STUFF(@YourDate,1,5,''),21,6,''),106),126) + STUFF(RIGHT(@YourDate,5),4,0,':'));

但是,如果您使用 LOGIN 的语言设置不是基于英语的设置,这将失败。

如果该值始终为 UTC,您实际上可以只使用“中间”TRY_CONVERT 表达式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多