我需要在postgresql中创建一个名为“months”的列的表。“Month”列应该有1月,2月等不是1,2,3等。我需要检索按月排序的数据。我应该使用什么数据类型以及如何检索按月排序的数据?
答案 0 :(得分:2)
如果您只需要保存月份,而不是整个日期,我会创建一个enum:
CREATE TYPE month_enum AS ENUM
('January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);
答案 1 :(得分:2)
最好将月份保存为整数,并在查询时显示月份名称:
with months(month) as (
select generate_series(1, 12)
)
select
month as month_number,
to_char(
'1999-12-31'::date + month * interval '1 month',
'Month'
) as month_name
from months
order by month_number; -- or by month_name
month_number | month_name
--------------+------------
1 | January
2 | February
3 | March
4 | April
5 | May
6 | June
7 | July
8 | August
9 | September
10 | October
11 | November
12 | December
为了便于构建查询,请创建一个返回月份名称的函数:
create or replace function month_name(month integer)
returns text as $$
select
to_char(
'1999-12-31'::date + month * interval '1 month',
'Month'
);
$$ language sql;
现在只是:
with months(month) as (
select generate_series(1, 12)
)
select
month as month_number,
month_name(month)
from months
order by month_number;
答案 2 :(得分:1)
根据您的要求,您可以根据需要选择一些选项:
假设您使用ENUM,则可以使用SELECT * FROM "Month" ORDER BY id ASC
。
a_horse_with_no_name确实有一点说,由于本地化问题,最好使用数月的数值。您可以使用不同语言为不同月份名称创建月份单独的表,但可能有更有效的方法。或者,可以拥有每个月的数字,并且在查询时,您可以根据建议的项目中的数字来调用月份的名称。这样,您可以根据本地化调用其他名称。