CHARINDEX-从nvarchar中挑选日期

时间:2019-05-14 07:52:31

标签: sql tsql

我正在尝试在以下代码中添加“天”。字符串沿

  • 1天3小时4分15秒
  • 23小时3分4秒
  • 4分钟1秒
  • 4小时3分1秒
  • 5天3小时1分0秒

每次尝试一些我认为会起作用的东西时,它都会在其他地方出错。下面的代码有效。我只需要在其中添加“天数”即可。

SELECT *,
    CASE WHEN CHARINDEX('hrs',REPLACE([Session Duration],' ',''),0) >0 
            THEN SUBSTRING(REPLACE([Session Duration],' ',''),0,CHARINDEX('hrs',REPLACE([Session Duration],' ',''),0))
            ELSE 0 END AS Hrs,
    CASE WHEN CHARINDEX('hrs',REPLACE([Session Duration],' ',''),0) >0  AND CHARINDEX('min',REPLACE([Session Duration],' ',''),0) >0
            THEN SUBSTRING(REPLACE([Session Duration],' ',''),CHARINDEX('hrs',REPLACE([Session Duration],' ',''),0)+3,CHARINDEX('min',REPLACE([Session Duration],' ',''),0) - CHARINDEX('hrs',REPLACE([Session Duration],' ',''),0)-3)
         WHEN CHARINDEX('min',REPLACE([Session Duration],' ',''),0) >0
            THEN  SUBSTRING(REPLACE([Session Duration],' ',''),0,CHARINDEX('min',REPLACE([Session Duration],' ',''),0))
        ELSE 0 END AS mins,
    CASE WHEN CHARINDEX('min',REPLACE([Session Duration],' ',''),0) >0  AND CHARINDEX('sec',REPLACE([Session Duration],' ',''),0) >0
            THEN SUBSTRING(REPLACE([Session Duration],' ',''),CHARINDEX('min',REPLACE([Session Duration],' ',''),0)+3,CHARINDEX('sec',REPLACE([Session Duration],' ',''),0) - CHARINDEX('min',REPLACE([Session Duration],' ',''),0)-3)
         WHEN CHARINDEX('sec',REPLACE([Session Duration],' ',''),0) >0
            THEN  SUBSTRING(REPLACE([Session Duration],' ',''),0,CHARINDEX('sec',REPLACE([Session Duration],' ',''),0))
        ELSE 0 END AS secs
FROM table1

2 个答案:

答案 0 :(得分:0)

下面的查询将返回Days,如果days字符串中没有Session Duration,它将返回0。

SELECT ...,
       ...,
       CASE WHEN CHARINDEX('days', REPLACE([Session Duration], ' ', ''), 0) > 0 
       THEN SUBSTRING(REPLACE([Session Duration], ' ', ''), 0, CHARINDEX('days', REPLACE([Session Duration], ' ', ''), 0))
       ELSE 0 END AS [Days],
      ...
FROM Table1

答案 1 :(得分:0)

我不确定这是最好的答案,但是我这样做是这样的:

declare @table table (data nvarchar(30))
insert into @table 
values
('1 sec'),
('4 min 1 sec'),
('4 hrs 3 min 1 sec'),
('23 hrs 3 min 4 sec'),
('1 days 3 hrs 4 min 15 sec'),
('1 days 23 hrs 59 min 59 sec'),
('5 days 3 hrs 1 min 0 sec'),
('532 days 3 hrs 1 min 0 sec')

select 
    data,
    CONVERT(int,LTRIM(SUBSTRING(data, PATINDEX('%[ 0-9][0-9] sec', data),PATINDEX('% sec', data)-PATINDEX('%[ 0-9][0-9] sec', data)+1))) secs,  
    CONVERT(int,LTRIM(SUBSTRING(data, PATINDEX('%[ 0-9][0-9] min%', data),PATINDEX('% min%', data)-PATINDEX('%[ 0-9][0-9] min%', data)+1))) mins,
    CONVERT(int,LTRIM(SUBSTRING(data, PATINDEX('%[ 0-9][0-9] hrs%', data),PATINDEX('% hrs%', data)-PATINDEX('%[ 0-9][0-9] hrs%', data)+1))) hrs,
    CONVERT(int,SUBSTRING(data, 0,PATINDEX('% days%', data))) days
from
    @table

输出:

enter image description here

不过,老实说,我的主要建议是不要像最初那样存储此信息,并在将值插入数据库表之前尝试将这些值拆分为单独的列。如果这样做的话,处理表将更快,并且将占用更少的磁盘空间,因为整数比字符串占用更少的空间。