2017-04-25 56 views
0

我做了一个批量插入到表中。SQL:如何在批量插入表格并获取总量后从文件中提取正确的日期值?

所有数据插入到Data

我有类似数据列的里面:

1451678889 1451678889 2017092 2017092  500,000.00  10,000.00 
1451678889 1451678889 2017091 2017091  500,000.00  10,000.00 
1451678889 1451678889 2017092 2017092  500,000.00  10,000.00 

现在,我需要在yyyy-mm-dd格式从2017092得到一个日期: 其中2017年和92年是今年的一天。我需要按日期分组总数。

当执行此查询:

select substring([data],34,15) from Staging_Table where ltrim(rtrim(substring([Data],42,5))) = '92' 

我得到正确的字符串2017092

当尝试这样做,以测试逻辑:

select dateadd(day, ltrim(rtrim(right('2017092',3))) - 1, DATEFROMPARTS(left('2017092',4) + 0, 1 ,1)) 

我得到这个:2017-04-02,这是2017年和第92天的正确日期

现在,替代过程“2017092”从表中的实际数据时:

select dateadd(day,ltrim(rtrim(right(substring('1451678889 1451678889 2017092 2017092',34,15),3))) - 1, DATEFROMPARTS(left(substring('1451678889 1451678889 2017092 2017092',34,15),4) + 0, 1,1)) 

或查询实际的表:

select dateadd(day,right(ltrim(rtrim(substring([Data],34,15))),3) - 1, DATEFROMPARTS(left(substring([Data],34,15),4) + 0, 1, 1)) from Staging_Table 
where ltrim(rtrim(substring([Data],42,5))) = '92' 

我得到一些奇怪的结果:0002-04-02 - 与错年。

我在做什么错?

+1

您需要修复您的导入,以便数据进入不同的列。 –

回答

1

调整子值:

select 
    Days = substring('1451678889 1451678889 2017092 2017092',41,3) 
    , Year = substring('1451678889 1451678889 2017092 2017092',37,4) 
    , Date = dateadd(day,substring('1451678889 1451678889 2017092 2017092',41,3) - 1 
    , datefromparts(substring('1451678889 1451678889 2017092 2017092',37,4)+0, 1,1) 
) 

rextester演示:http://rextester.com/MED20206

回报:

+------+------+---------------------+ 
| Days | Year |  Date   | 
+------+------+---------------------+ 
| 092 | 2017 | 2017-04-02 00:00:00 | 
+------+------+---------------------+ 

使之成为更灵活一点,你可以使用patindex()来确定您想要的子字符串的可能位置:

create table t (data varchar(256)); 
insert into t values 
('1451678889 1451678889 2017092 2017092  500,000.00  10,000.00') 
,('1451678889 1451678889 2017091 2017091  500,000.00  10,000.00') 
,('1451678889 1451678889 2017092 2017092  500,000.00  10,000.00'); 

/* --------------- */ 

select 
    Days = substring(data,patindex('% [1-2][0-9][0-9][0-9][0-9][0-9][0-9] %',data)+5,3) 
    , Year = substring(data,patindex('% [1-2][0-9][0-9][0-9][0-9][0-9][0-9] %',data)+1,4) 
    , Date = dateadd(day,substring(data,patindex('% [1-2][0-9][0-9][0-9][0-9][0-9][0-9] %',data)+5,3) - 1 
    , datefromparts(substring(data,patindex('% [1-2][0-9][0-9][0-9][0-9][0-9][0-9] %',data)+1,4)+0, 1,1) 
) 
from t 

rextester演示:http://rextester.com/JWJVE60941

回报:

+------+------+---------------------+ 
| Days | Year |  Date   | 
+------+------+---------------------+ 
| 092 | 2017 | 2017-04-02 00:00:00 | 
| 091 | 2017 | 2017-04-01 00:00:00 | 
| 092 | 2017 | 2017-04-02 00:00:00 | 
+------+------+---------------------+ 

而且清理的代码一点,我们可以抛出模式到一个变量:

declare @pattern varchar(64) = '% [1-2][0-9][0-9][0-9][0-9][0-9][0-9] %'; 

select 
    Days = substring(data,patindex(@pattern,data)+5,3) 
    , Year = substring(data,patindex(@pattern,data)+1,4) 
    , Date = dateadd(day,substring(data,patindex(@pattern,data)+5,3) - 1 
    , datefromparts(substring(data,patindex(@pattern,data)+1,4)+0, 1,1) 
) 
from t 
相关问题