使用奇怪的格式过滤日期数据集
Filtering a data set on dates with a weird format
我有一列由日期填充,格式如下...
purch_dt
8/18/2014
9/27/2014
1/3/2015
10/29/2016
11/5/2016
2/9/2017
3/1/2017
6/29/2017
12/27/2017
2/25/2018
我想过滤数据集以仅包含特定范围内的日期,但是当我尝试编码 WHERE purch_dt BETWEEN '3/1/2017' AND '6/29/2017 ' 我收到错误 "A character string failed conversion to a numeric value." 知道如何解决这个问题吗?
不是 100% 确定这一点,但至少想提供帮助。我认为如果您适当地转换该列,它应该可以工作,如:
select *
from my_table
where cast(purch_dt as TIMESTAMP(0) format 'd/m/yyyy')
between date '2017-03-01' AND date '2017-06-29'
无论如何,我强烈建议将日期存储为 DATE
而不是 VARCHAR
。将它们存储为 VARCHAR
只是自找麻烦。
据我所知,Teradata 中没有格式或强制转换可以接受一位数的月份和日期。所以你必须解析这个丑陋的字符串并将其重建为日期。
STRTOK
将为您在 \ 定界符上拆分,lpad 会在您需要的地方为您提供前导 0。
create volatile table vt_NotADate
(not_date varchar(10))
on commit preserve rows;
insert into vt_notadate values ('12/27/2017');
insert into vt_notadate values ('9/1/2017');
select
not_date,
cast(lpad(strtok(not_date,'/',1),2,'0') as char(2)) as m,
cast(lpad(strtok(not_date,'/',2),2,'0') as char(2)) as d,
strtok(not_date,'/',3) as y,
cast (y || '-' || m || '-' || d as date) as a_date
from
vt_notadate
我有一列由日期填充,格式如下...
purch_dt
8/18/2014
9/27/2014
1/3/2015
10/29/2016
11/5/2016
2/9/2017
3/1/2017
6/29/2017
12/27/2017
2/25/2018
我想过滤数据集以仅包含特定范围内的日期,但是当我尝试编码 WHERE purch_dt BETWEEN '3/1/2017' AND '6/29/2017 ' 我收到错误 "A character string failed conversion to a numeric value." 知道如何解决这个问题吗?
不是 100% 确定这一点,但至少想提供帮助。我认为如果您适当地转换该列,它应该可以工作,如:
select *
from my_table
where cast(purch_dt as TIMESTAMP(0) format 'd/m/yyyy')
between date '2017-03-01' AND date '2017-06-29'
无论如何,我强烈建议将日期存储为 DATE
而不是 VARCHAR
。将它们存储为 VARCHAR
只是自找麻烦。
据我所知,Teradata 中没有格式或强制转换可以接受一位数的月份和日期。所以你必须解析这个丑陋的字符串并将其重建为日期。
STRTOK
将为您在 \ 定界符上拆分,lpad 会在您需要的地方为您提供前导 0。
create volatile table vt_NotADate
(not_date varchar(10))
on commit preserve rows;
insert into vt_notadate values ('12/27/2017');
insert into vt_notadate values ('9/1/2017');
select
not_date,
cast(lpad(strtok(not_date,'/',1),2,'0') as char(2)) as m,
cast(lpad(strtok(not_date,'/',2),2,'0') as char(2)) as d,
strtok(not_date,'/',3) as y,
cast (y || '-' || m || '-' || d as date) as a_date
from
vt_notadate