How to Get the First Day of the Month in Oracle SQL?

How to Get the First Day of the Month in Oracle SQL?

In Oracle SQL, there are several methods to calculate the first day of the month from a given date. Below are examples of these methods along with their expected outputs if we assume that today's date is January 4, 2024 (2024-01-04):

Example 1: Using TRUNC with Date

The TRUNC function can be used to truncate a date to the first day of the month.

SELECT TRUNC(SYSDATE, 'MM') AS first_day_of_month FROM dual;

Expected Output:

FIRST_DAY_OF_MONTH
-------------------
2024-01-01

Explanation: The TRUNC function removes the time component and sets the day to the first of the month for the given date.

Example 2: Arithmetic with LAST_DAY

Use the LAST_DAY function to get the last day of the previous month and then add one day.

SELECT LAST_DAY(ADD_MONTHS(SYSDATE, -1)) + 1 AS first_day_of_month FROM dual;

Expected Output:

FIRST_DAY_OF_MONTH
-------------------
2024-01-01

Explanation: ADD_MONTHS subtracts one month, LAST_DAY finds the last day of that month, and adding 1 gets us to the first day of the current month.

Example 3: Using TO_DATE and TO_CHAR

Reconstruct the date by extracting the year and month, then appending the first day.

SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM') || '-01', 'YYYY-MM-DD') AS first_day_of_month FROM dual;

Expected Output:

FIRST_DAY_OF_MONTH
-------------------
2024-01-01

Explanation: TO_CHAR formats the date as a string to include only the year and month. By adding the '-01', we specify the first day and then convert it back to a date.

Example 4: Using EXTRACT

Extract the year and month parts of the date and then construct the first day of the month.

SELECT TO_DATE(EXTRACT(YEAR FROM SYSDATE) || '-' || EXTRACT(MONTH FROM SYSDATE) || '-01', 'YYYY-MM-DD') AS first_day_of_month FROM dual;

Expected Output:

FIRST_DAY_OF_MONTH
-------------------
2024-01-01

Explanation: EXTRACT is used to get the numerical year and month values from SYSDATE. These are then concatenated with '-01' to form a string representing the first day of the month, which is converted back to a date.

These expected outputs assume that the NLS_DATE_FORMAT session parameter is set to display dates in the YYYY-MM-DD format. If the format is different, the output may appear in a different date format. You can set this format in your session using the ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'; command before executing the queries.