【问题标题】:Select a date in a string and convert it to datetime在字符串中选择一个日期并将其转换为日期时间
【发布时间】:2020-03-31 16:26:06
【问题描述】:

我有一个类似的字符串:

'间谍美国 03/20/20 P45'

我只想从字符串中选择日期。

我目前的查询是:

Select Ticker, SUBSTRING(Ticker, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%',o.Ticker),8) AS 'myDate' FROM TABLE

返回:'SPY US 03/20/20 P45', 03/20/20

我希望 myDate 处于日期时间。

我尝试了各种转换和转换的变形,但都失败了,大概是因为他们希望格式为 YYYY-MM-DD 而不是 MM/DD/YY。

我“最聪明”的转换尝试是这样的:

CONVERT(DATETIME, SUBSTRING(o.Ticker, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%',o.Ticker),8),1)

在这里阅读风格指南后:https://www.w3schools.com/sql/func_sqlserver_convert.asp 但它仍然失败。

理想的日期结束格式是 YYYY-MM-DD

编辑添加:

我一直在摆弄它,并意识到我过度简化了我的问题。如果我只是在一个字符串上测试它,转换就可以工作,但整个查询涉及多个连接。

【问题讨论】:

  • convert 无论如何都应该工作。请发布您的整个 SQL 语句

标签: sql sql-server sqldatetime sql-convert


【解决方案1】:

据我所知,您正在寻找这样的东西。

您可以使用string_split()函数将字符串与空格分开,然后使用try_cast()函数检查每个值是否为date

declare @string as varchar(120) = 'SPY US 03/20/20 P4'
; with cte as (select 
  value
from string_split (@string, ' ')
)Select value from cte where try_cast (value as datetime) is not null

直播db<>fiddle演示。

【讨论】:

    【解决方案2】:

    所以事实证明,列中的一些条目没有友好的日期格式,所以 patindex 子句返回废话。

    由于某种原因导致整个操作失败(而不是仅仅在少数失败的条目上返回 null)。

    一旦我将整个(最终更复杂的连接语句)选择到临时表中,我就可以将子字符串 try_convert 转换为日期并运行我的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 2011-12-16
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2019-04-12
      • 2011-09-08
      相关资源
      最近更新 更多