如何在不使用to_char()函数的情况下在PostgreSQL中从日期中提取年份和月份?


104

我想选择sql SELECT "year-month" from table group by "year-month" AND order by date:,其中year-month-格式为日期“ 1978-01”,“ 1923-12”。 选择couse work的to_char,而不是“正确”的顺序:

to_char(timestamp_column, 'YYYY-MM')

1
为什么订单与to_char不正确?
yairchu

1
投票结束尚不清楚,因为尚不清楚为什么to_char()不可接受。
亚历克斯R

Answers:


67
date_part(text, timestamp)

例如

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


5
如何一次提取月份和年份?您可以显示一个示例吗?
mokNathal

3
date_part('month',timestamp'2001-02-16 20:38:40'),date_part('year',timestamp'2001-02-16 20:38:40')
MK。

感谢您的快速答复,但我们不能在单个功能中执行此操作,还是必须分别为月份和年份调用两次
mokNathal

2
你想做什么?只是得到一个字符串?然后使用具有日期格式的to_char函数,您需要postgresql.org/docs/8.2/static/functions-formatting.html
MK。

181
to_char(timestamp, 'YYYY-MM')

您说该命令不是“正确的”,但是我看不出为什么它是错误的(至少直到10000年出现)。


如果您使用的是“时间戳” to_char(to_timestamp(e。“ timestamp”),'MM-YYYY')
Bruno Lee

@BrunoMarinho如果您要按时间顺序订购,则不要使用“ MM-YYYY进行订购”。如果您希望显示该内容,您仍然可以使用该格式的列,但不必
按此

4
我不明白为什么它不是公认的答案。
Prabowo Murti

在这种情况下,您无法 ORDER BY约会。
aagjalpankaj

1
@飞行员:可以使用ORDER BY to_char(timestamp, 'YYYY-MM')。或者,如果您这样做了SELECT to_char(timestamp, 'YYYY-MM') AS date,则可以简单地使用ORDER BY date
yairchu

38

使用该date_trunc方法截断一天(或您想要的其他任何时间,例如,星期,年,日等)。

按月对订单的销售进行分组的示例:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;

1
那就对了。您可以使用U进行比较:date(date_trunc('month',now()))= to_Date(5 :: varchar ||''|| 2017 :: varchar,'mm YYYY')
亚历杭德罗·萨拉曼卡·马祖埃洛

也比“ to_char(timestamp,'YYYY-MM')”快两倍。
Le Droid

20

您可以使用以下命令截断所有信息date_trunc(text, timestamp)

select date_trunc('month',created_at)::date as date 
from orders 
order by date DESC;


示例:

输入:

created_at = '2019-12-16 18:28:13'

输出1:

date_trunc('day',created_at)
// 2019-12-16 00:00:00

输出2:

date_trunc('day',created_at)::date 
// 2019-12-16

输出3:

date_trunc('month',created_at)::date 
// 2019-12-01

输出4:

date_trunc('year',created_at)::date 
// 2019-01-01

16

第一种选择

date_trunc('month', timestamp_column)::date

它将保留从第一天开始的所有月份的日期格式。

例:

2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

第二选择

to_char(timestamp_column, 'YYYY-MM')

@yairchu提出的解决方案在我的情况下效果很好。我真的很想舍弃“每日”信息。


11

您可以使用EXTRACT函数pgSQL

EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 05

有关更多详细信息, PGSQL日期时间


1

它适用于“大于”功能而不是小于。

例如:

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;

工作正常。

但对于

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;

我出错了。


它的作用大于功能而不是小于。例如:从“ table_name”中选择date_part('year',txndt),其中date_part('year',txndt)>'2000'限制为10;工作正常。但是对于从“ hpi_validator_q3”中选择date_part('year',txndt)。“ cdm_inv_exceptions”,其中date_part('year',txndt)<'2000'限制为10;我出错了。
Anurag Bhardwaj

1
这不是答案-如果您有问题,请发布新问题,而不是将问题添加为答案。
Markoorn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.