PostgreSQL: Date Filtering and Transformations

Let’s use the following Projects table as an example:

Column NameData Type
idinteger
titlecharacter varying(255)
start_datedate
end_datedate
 id |          title           | start_date |  end_date  
----+--------------------------+------------+------------
  1 | Build a cool site        | 2011-10-28 | 2012-01-26
  2 | Update TPS Reports       | 2011-07-20 | 2011-10-28
  3 | Design 3 New Silly Walks | 2009-05-11 | 2009-08-19
  • Filter by a specific date
SELECT
  *
FROM
  start_date = '2011-10-28';
  • Filter by a range

Please notice that the between is inclusive

SELECT
  *
FROM
  start_date BETWEEN '2011-10-28' AND '2011-10-30';

For non-inclusive results, you can use

SELECT
  *
FROM
  start_date > '2011-10-28' 
  AND start_date < '2011-10-30'; 

-- This will return records with start_date = 2011-10-29 
  • Filter by HOUR, DAY, MONTH, YEAR
SELECT  
  *
FROM  
  projects
WHERE
  EXTRACT( DAY FROM start_date ) = 20
  AND EXTRACT( MONTH FROM start_date ) = 07
  AND EXTRACT( YEAR FROM start_date ) = 2011;

You can use ::DATE::TIMESTAMP to cast a date into timestamp

SELECT  
  *,
  current_date::DATE::TIMESTAMP
FROM  
  projects
WHERE
  EXTRACT( HOUR FROM current_date::DATE::TIMESTAMP) = 0;
  • Filter by Relative Dates
SELECT  
  *
FROM  
  projects
WHERE
  start_date >= current_date - INTERVAL '7 days';
  • Filter by Timestamps

To filter timestamps values using a date value

SELECT 
  * 
FROM 
  projects 
WHERE 
  start_date::date = '2023-09-01';

-- This converts the start_date(timestamp to date)

Transformations

  • String to Date

Function: TO_DATE(string, format)
Output: date

SELECT  
  TO_DATE(new_date, 'YYYYMMDD') AS start_date
FROM  
  projects;
  • String to Timestamp

Function: TO_TIMESTAMP(string, format)
Output: timestamp

SELECT 
  TO_TIMESTAMP(new_date, 'YYYY-MM-DD HH24:MI:SS')
FROM
  projects;
  • Date to Timestamp
SELECT  
  start_date::TIMESTAMP
FROM  
  projects;
  • Timestamp to Date
SELECT  
  start_date::DATE
FROM  
  projects;
  • Date to String

Function: TO_CHAR(date, format) – The format that you want
Output: String

SELECT  
  TO_CHAR(start_date, 'YYYYMMDD')
FROM  
  projects;
  • Timestamp to String

Function: TO_CHAR(date, format) – The format that you want
Output: String

SELECT  
  TO_CHAR(start_date, 'YYYY-MM-DD HH24:MI:SS')
FROM  
  projects;