postgres中几个月(仅几个月)的数据类型是什么?

时间:2015-02-20 10:42:35

标签: postgresql

我需要在postgresql中创建一个名为“months”的列的表。“Month”列应该有1月,2月等不是1,2,3等。我需要检索按月排序的数据。我应该使用什么数据类型以及如何检索按月排序的数据?

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)

根据您的要求,您可以根据需要选择一些选项:

  • 如果你只需要几个月作为静态记录,但你实际上并不需要时间,你可以使用枚举,正如Mureinik回答的那样,
  • 如果您需要将月份作为特定时间的一部分,则可以使用datetime

假设您使用ENUM,则可以使用SELECT * FROM "Month" ORDER BY id ASC

a_horse_with_no_name确实有一点说,由于本地化问题,最好使用数月的数值。您可以使用不同语言为不同月份名称创建月份单独的表,但可能有更有效的方法。或者,可以拥有每个月的数字,并且在查询时,您可以根据建议的项目中的数字来调用月份的名称。这样,您可以根据本地化调用其他名称。

相关问题