0

我有一个像这样的字符串:

'间谍美国 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

编辑添加:

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

4

2 回答 2

0

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

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

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

于 2020-03-31T18:32:25.517 回答
0

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

您可以使用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演示。

于 2020-03-31T16:30:36.183 回答