从列中提取值

问题描述 投票:0回答:1

我在 MySQL 服务器数据库中有一张表,其中有一列。在那一栏中我有价值观。我想以日期格式从该列中提取 Created_Date 。

该栏下的值是这样的:

'Created_Date: Fri Feb 23 2024 14:37:18 GMT+0000 (Coordinated Universal Time), Message: ghiwns binjbe snbu'

因此,我编写了可以提取 Created_Date 的代码。但我无法将其转换为日期格式。

代码:

select 
    created_date,
    case 
        when upper(created_date) like '%Created_Date%' 
            then trim(SUBSTRING(created_date, CHARINDEX(':', created_date, CHARINDEX('Created_Date', upper(created_date), 0)) + 1,
                     CHARINDEX(',', created_date, CHARINDEX(':', created_date, CHARINDEX('Created_Date', upper(created_date), 0))) - CHARINDEX(':', created_date, CHARINDEX('Created_Date', upper(created_date), 0)) - 1)) 
            else '' 
    end Created_Date
from
    table

如何将其转换为日期格式?

例如我有

"Created_Date: Fri Feb 23 2024 14:37:18 GMT+0000 (Coordinated Universal Time)"

我想要这个:2024 年 2 月 23 日。

我怎样才能实现它?我该如何编写 SQL 查询?

sql sql-server datetime
1个回答
0
投票

你可以这样做:

SELECT  TRY_CONVERT(DATETIME, finishValue, 100) AS dateValue
,   *
FROM    (
    VALUES  ('Some other text... Created_Date: Fri Feb 23 2024 14:37:18 GMT+0000 (Coordinated Universal Time)')
    ,   ('Banana')
    ,   ('Created_Date: Fri Mar 1 1981')
    ,   ('Init text Created_Date: mon Apr 1 1981 some other text')
    ,   ('Bad date Created_Date: Fri Mar 99 1981')
    ,   ('Bad string Created_Date: ')
    ,   ('Bad string#2 Created_Date: 19000101')
    ) x (textcolumn)
CROSS APPLY (
        SELECT  STUFF(textcolumn, 1, NULLIF(charindex('Created_Date: ', x.textcolumn), 0) + len('Created_Date:') + 4, '') AS startValue
    ) s
CROSS APPLY (
        SELECT  LEFT(startvalue, NULLIF(CHARINDEX(' ', startvalue + ' ', 8 /*assume long enough string*/), 0) - 1) AS finishValue
    ) e
  1. 首先,找到 Created_date: 事件并将其从字符串以及字符串的“day”部分中删除:(星期五)使用

    STUFF

  2. 然后你就剩下:

    Feb 23 2024 14:37:18 ...
    。然后从第 8 个字符
    CHARINDEX(' ', startvalue + ' ', 8)
    中找到空格,这应该为您提供 2024 年和时间部分之间的空格。

  3. 最后,尝试使用样式100将

    Feb 23 2024
    转换为日期时间。如果失败,则返回NULL。

© www.soinside.com 2019 - 2024. All rights reserved.