我在表格中进行了批量插入。
所有数据都已插入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
- 错误的一年。
我做错了什么?
答案 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