首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CHARINDEX -挑出nvarchar的日子

CHARINDEX -挑出nvarchar的日子
EN

Stack Overflow用户
提问于 2019-05-14 07:52:31
回答 2查看 72关注 0票数 1

我试图在下面的代码中添加“days”。这条线是沿着……的方向

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

每次我尝试一些我认为会起作用的东西,它就会在别的事情上出错。下面的代码可以工作。我只需要加上“天”。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-05-14 08:06:57

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-05-14 09:19:21

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

代码语言:javascript
复制
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

输出:

不过,老实说,我的主要建议是,在将这些信息插入数据库表之前,首先不要将这些信息存储在不同的列中,并尝试将值拆分到单独的列中。如果这样做,处理表的速度将更快,而且它还会占用更少的磁盘空间,因为整数比字符串占用的空间更少。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56125453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档