我有一个日期列,其中包含人们的生日。其中一些包含90多年前的日期,我希望这些日期上限为90年前。
示例
current desired
1930-01-01 1932-01-01
1930-02-11 1932-02-11
正如你所看到的,如果出生日期自然超过90年,那么理想的状态是从当前日期起90年。
它比我最初猜测的更棘手,而且它可以写得更简单,现在似乎有"是竞争";,尽管这比以前的";
90年以上无日期版本:
SELECT column1 as "current"
,iff(column1 < dateadd('year',-90, CURRENT_DATE),
date_from_parts(
year(CURRENT_DATE) - 90 + (month(column1)*100+day(column1) < month(CURRENT_DATE)*100 + day(CURRENT_DATE))::int,
month(column1),
day(column1)),
column1
) as desired
FROM VALUES
('1934-01-01'::date),
('1932-03-28'::date),
('1932-03-20'::date),
('1931-03-28'::date),
('1931-03-20'::date),
('1930-01-01'::date),
('1930-02-11'::date);
当前 | 所需 | |
---|---|---|
1934-01-01 | 1934-01-01 | |
1932-03-28 | 1932-03-28 | |
1932-03-20 | 1933-03-20 | |
1931-03-28 | 1932-03-28 | |
1931-03-20 | 1933-03-20 | |
1930-01-01 | 1933-01-01 | |
1930-02-11 | 1933-02-11 |
这确实是一个棘手的问题。我甚至在timeanddate.com上查看了最长90年的日期差异-看起来不错。如果有人发现这方面的问题,请感谢反馈。
select iff(extract(year,dateadd('year',90,column1::date))>extract(year,'2022-02-28'::date),
column1,
dateadd(day,
datediff(day,column1::date,dateadd(year,-90,'2022-02-28'::date)),
column1::date
)) as test
from
values
('1932-02-29'::date)
,('1932-02-28'::date)
,('1932-03-01'::date)
,('1928-02-29'::date)
,('1924-02-29'::date)
,('1930-01-01'::date)
,('1940-05-01'::date)
,('1950-12-01'::date)
,('1980-10-01'::date)
,('1920-06-01'::date)
;
+------------+
| TEST |
|------------|
| 1932-02-28 |
| 1932-02-28 |
| 1932-02-28 |
| 1932-02-28 |
| 1932-02-28 |
| 1932-02-28 |
| 1940-05-01 |
| 1950-12-01 |
| 1980-10-01 |
| 1932-02-28 |
+------------+