【问题标题】:Repeat the day of the week for each time inside a string在字符串中的每次重复星期几
【发布时间】:2022-01-10 09:10:08
【问题描述】:

我有一个只有一列和大约 3000 行的表格,它们遵循相同的模式。我想在行的同一字符串中包含每个 TIME 字符串开头的星期几。

原表:

DATA_TIME_COMBINATION
Monday 3 am HM, 5 am HC, 10 pm HX
Saturday AB 6 am, WE 5 pm
Sunday Friday AN 50 TU,FG 55 RE, DC 56 JJ
Tuesday 10 am, 5 am, 1 am
Wednesday 12 pm-9 pm- 1 am

需要结果:

DATA_TIME_COMBINATION
Monday 3 am HM, Monday 5 am HC, Monday 10 pm HX
Saturday AB 6 am, Saturday WE 5 pm
Sunday Friday AN 50 TU, Sunday Friday FG 55 RE, Sunday Friday DC 56 JJ
Tuesday 10 am, Tuesday 5 am, Tuesday 1 am
Wednesday 12 pm- Wednesday 9 pm- Wednesday 1 am

提前致谢!

【问题讨论】:

  • 请向我们展示您到目前为止所做的尝试。
  • 我试图通过首先在 mytable 上创建一个标识行来将时间带到一个单独的行中:ALTER TABLE MYTABLE ADD ID INT IDENTITY
  • 然后我将逗号后的 TIME 移动到另一行,方法是:SELECT s.ID, f.value FROM mytable AS s CROSS APPLY STRING_SPLIT(s.[DATA_TIME_COMBINATION], ',') as f ;
  • edit 对您的问题的任何澄清
  • 您能否准确地描述问题,即时间是多少?是一位数还是两位数、一个可选空格和“AM”或“PM”(不区分大小写)?永远不要“中午”、“8:15”、“20:15”、“7PST”、“日落”、“下午 1 点辞职”……?

标签: sql sql-server tsql


【解决方案1】:

一旦你知道了角色和日子。

然后它会变成一个简单的替换。

平日申请单叉。

角色到位的一秒钟。

SELECT 
  REPLACE(REPLACE([DATA_TIME_COMBINATION], chr, chr+' '+days+' '),'  ',' ') as DATA_TIME_COMBINATION
FROM mytable AS t
CROSS APPLY (
  SELECT STRING_AGG(value, ' ') days
  FROM STRING_SPLIT(
  LEFT([DATA_TIME_COMBINATION], PATINDEX('%[a-z] [0-9]%', [DATA_TIME_COMBINATION])), ' ') spl
  WHERE value LIKE '%day'
) ca1
CROSS APPLY (
   SELECT 
   chr = SUBSTRING([DATA_TIME_COMBINATION], PATINDEX('%[^A-Za-z0-9 ]%', [DATA_TIME_COMBINATION]), 1)
) ca2;
DATA_TIME_COMBINATION
Monday 3 am HM, Monday 5 am HC, Monday 10 pm HX
Saturday AB 6 am, Saturday WE 5 pm
Sunday Friday AN 50 TU, Sunday Friday FG 55 RE, Sunday Friday DC 56 JJ
Tuesday 10 am, Tuesday 5 am, Tuesday 1 am
Wednesday 12 pm- Wednesday 9 pm- Wednesday 1am

测试 dbfiddle here

【讨论】:

    【解决方案2】:

    似乎你想用逗号和字符串开头的第一个单词替换逗号

    select replace(DATA_TIME_COMBINATION, ',', 
        concat(',', substr(DATA_TIME_COMBINATION,1,charindex(' ', DATA_TIME_COMBINATION)-1)))
    from my_table
    

    【讨论】:

    • 这是一个很好的解决方案。谢谢!这个解决方案的唯一问题是它只会为每一行选择第一天。例如 row3 有“Sunday Friday”,必须像这样重复:“Sunday Friday AN 50 TU, Sunday Friday FG 55 RE, Sunday Friday DC 56 JJ”。该解决方案只会选择“星期日”这样重复:“星期日 AN 50 TU,星期日 FG 55 RE,星期日 DC 56 JJ”。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2011-12-17
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多