Moving from the integer to the date type uses a complex USING expression. Let's break that down step by step so that we can see why, as follows:
postgres=# ALTER TABLE birthday
ALTER COLUMN dob SET DATA TYPE date
USING date(to_date(dob::text, 'YYMMDD') -
(CASE WHEN dob/10000 BETWEEN 16 AND 69
THEN interval '100 years'
ELSE interval '0' END));
First, we can't move directly from integer to date. We need to convert it to text and then to date. The dob::text statement means cast to text.
Once we have text, we use the to_date() function to move to a date type.
This is not enough; our starting data was 690926, which we presume is a date in the YYMMDD format. When PostgreSQL converts this data to a date, it assumes that the two-digit year, 69, is in the current century because it chooses the year nearest to 2020. So it outputs 2069 rather than 1969. This is why a case statement is added to reduce any year between 16 and 69 to be a date in the previous century by explicitly subtracting an interval of 100 years. We do not need to take away one century for years after 69 because they are already placed in the 20th century.
It is very strongly recommended that you test this conversion by performing a SELECT first. Converting data types, especially to/from dates, always causes some problems, so don't try to do this quickly. Always take a backup of the data first.