我有一个列,这是字符串数据类型,但持有日期值。我将其转换为DATE,然后在POSTGRESQL中使用以下格式从中提取YEAR。然而,如果我试图获取最近10年的数据,我看到任何小于最近50年的日期(即小于1970年,采用2069、2068等格式)。假设有一个日期值的格式为(10/1/58,尽管将过去10年的过滤器设置为2058,但它仍被列出)
我使用下面的代码转换为DATE并提取年份
extract YEAR FROM TO_DATE(release_date,'MM/DD/YY')
然后在我的查询中使用下面的条件来获取最近10年的数据
where extract(year from current_timestamp)-EXTRACT(YEAR FROM TO_DATE(release_date,'MM/DD/YY')) <=10
POSTGRESQL如何解决这个问题
嗯:
select extract(year from current_timestamp);
date_part
-----------
2021
select EXTRACT(YEAR FROM TO_DATE('10/1/58','MM/DD/YYYY'));
date_part
-----------
58
select 2021 - 58;
?column?
----------
1963
1963 ! <= 10
您最好的选择是通过将YY
转换为YYYYand better yet by storing in a
日期'字段而不是作为字符串来清理日期数据。
因为这是有记录的行为
使用一个函数来确定年份
CREATE TABLE mytable(release_date varchar(20))
INSERT INTO mytable VALUES ('01/01/69'),('01/01/70')
CREATE OR REPLACE FUNCTION corectyear(inyear integer) RETURNS integer AS $$ DECLARE curyear INTEGER; BEGIN SELECT extract( YEAR FROM CURRENT_DATE) INTO curyear; IF inyear > curyear THEN RETURN inyear - 100; ELSE RETURN inyear; END IF; END; $$ LANGUAGE plpgsql;
SELECt corectyear(extract( YEAR FROM TO_DATE(release_date,'MM/DD/YY'))::INTEGER) FROM mytable
|正确年份|| ---------: || 1969 || 1970 |
db<此处小提琴>此处小提琴>