SQL:如何在批量插入表格后从文件中提取正确的日期值并获取总金额?

时间:2017-04-25 15:19:56

标签: sql bulkinsert sql-server-2016

我在表格中进行了批量插入。

所有数据都已插入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

现在,我需要以2017092格式从yyyy-mm-dd获取日期: 其中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 个答案:

答案 0 :(得分: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