How to format a Vertica date column into just the month? - sql

I am trying to format a Vertica date column into only the month.
I would need the final value in some sort of date datatype so in the report I can order the results by date/time, not order by text. So that February sorts after January etc.
select TO_DATE(TO_CHAR(purchase_date), 'Month')
from transactions
order by 1;
I am also tried:
select TO_DATE(TO_CHAR(MONTH(purchase_date)), 'Month')
from transactions
order by 1;
The above statements produce an error "Invalid value for Month"
Any ideas?

How about this?
select to_char(purchase_date, 'Month')
from transactions
order by purchase_date;
You can order by columns that are not in the select list.
EDIT:
If you want to combine months from multiple years, the above will not work quite right. This will:
select to_char(purchase_date, 'Month')
from transactions
order by extract(month from purchase_date);

Select TO_CHAR((NOW() - INTERVALYM '1 MONTH'), 'MON');
Output:
JUN
This will help you get only the name of the previous month.

We can directly use date_part to get a month from the timestamp.
SELECT DATE_PART('MONTH', purchase_date) purchase_date
TO_DATE gives the complete date, if you only provide MM in the parameter then Vertica set default year and day.
Let suppose the month number is 8.
SELECT TO_DATE(purchase_date, 'MM')
Output: (0001-08-01)

Related

Oracle sql - get months id between two dates

I have date range eg. '2021-01-05' and '2021-02-10'. Two months January and February.
Need resaults:
Months
------
1
2
You want to iterate through the months. This is done with a recursive query in SQL:
with months (month_start_date) as
(
select trunc(:start_date, 'month') from mytable
union all
select month_start_date + interval '1' month
from months
where month_start_date < trunc(:end_date, 'month')
)
select
extract(year from month_start_date) as year,
extract(month from month_start_date) as month
from months
order by month_start_date;
You can use EXTRACT function that Oracle has to achieve this. In your case it should look something like:
SELECT EXTRACT (month FROM date_column) as "Months"
For more information about this function you can check out documentation here.

How to display Month Names from month numbers

Now i am in a condition, Where I am just displaying the month names and some data grouped by month number. There is a small issue. I need to get month names instead of month numbers from Oracle.
try this:
SELECT TO_CHAR(TO_DATE(11, 'MM'), 'MONTH') FROM DUAL;
result:
NOVEMBER
SQL fiddle demo
This can be resolve your problem
SELECT TO_CHAR(TO_DATE(1, 'MM'), 'MON') FROM DUAL;
How about this:
SELECT TO_CHAR(SYSDATE, 'Month') FROM DUAL;

How can I do a yearly report grouped by month?

I am using the below query to list the number of transactions by month. Does anyone know how can I list by year too. This means that the query returns all my transactions for the whole year except the current month.
That is if today it is the 29th August 2011 I need a yearly report grouped by month till the month of July (since august is not complete)
select to_char(date,'MONTH YYYY'), sum(number_of_transactions)
from header
group by date
order by date
select to_char(trunc(date,'yyyy'),'YYYY') as year, sum(number_of_transactions)
from header
where date < trunc(sysdate, 'mm')
group by trunc(date,'yyyy')
order by year
Is this what you need?
SELECT TO_CHAR(date, 'YYYY'), SUM(number_of_transactions)
FROM header
GROUP BY TO_CHAR(date, 'YYYY')

find month days

I need to find how many days have in this month which we can find with today's date
select to_number(to_date('01.02.2011')-to_date('01.01.2011')) from dual;
not this query
Have any other queries?
select extract(day from last_day(sysdate)) from dual
?
You can do it with a trunc(<date>, 'mm') (which returns the first day of the month) and an add_months(<date>,1) which add one month to a particular day. So, in order to find out how many days the month has in which we currently are (i.e. sysdate), you could go with something like:
select
add_months(trunc(sysdate, 'mm'),1) - trunc(sysdate, 'mm')
from
dual;
select DateDiff(Day,GETDATE(),DateAdd(month,1,GETDATE()))

How to extract year and month from date in PostgreSQL without using to_char() function?

I want to select sql:
SELECT "year-month" from table group by "year-month" AND order by date, where
year-month - format for date "1978-01","1923-12".
select to_char of couse work, but not "right" order:
to_char(timestamp_column, 'YYYY-MM')
to_char(timestamp, 'YYYY-MM')
You say that the order is not "right", but I cannot see why it is wrong (at least until year 10000 comes around).
date_part(text, timestamp)
e.g.
date_part('month', timestamp '2001-02-16 20:38:40'),
date_part('year', timestamp '2001-02-16 20:38:40')
http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html
Use the date_trunc method to truncate off the day (or whatever else you want, e.g., week, year, day, etc..)
Example of grouping sales from orders by month:
select
SUM(amount) as sales,
date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;
You can truncate all information after the month using date_trunc(text, timestamp):
select date_trunc('month',created_at)::date as date
from orders
order by date DESC;
Example:
Input:
created_at = '2019-12-16 18:28:13'
Output 1:
date_trunc('day',created_at)
// 2019-12-16 00:00:00
Output 2:
date_trunc('day',created_at)::date
// 2019-12-16
Output 3:
date_trunc('month',created_at)::date
// 2019-12-01
Output 4:
date_trunc('year',created_at)::date
// 2019-01-01
1st Option
date_trunc('month', timestamp_column)::date
It will maintain the date format with all months starting at day one.
Example:
2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01
2nd Option
to_char(timestamp_column, 'YYYY-MM')
This solution proposed by #yairchu worked fine in my case. I really wanted to discard 'day' info.
You Can use EXTRACT function pgSQL
EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 5
For more details
PGSQL Date-Time
It is working for "greater than" functions not for less than.
For example:
select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;
is working fine.
but for
select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;
I am getting error.