2015-04-24 1 views
2

Я ищу, чтобы создать таблицу дат в базе данных postgres. Выборочные данные, как ожидается, выглядеть следующим образом:Как создать таблицу gregorian для ISO-8601 в postgres

date key = 00001 
calendar_date= 1/1/2015 
week_num= 1 
month_num= 1 
month_name= Jan 
quarter_num= 1 
calendar_year= 2015 
iso_dayofweek= 4 
dayofweek_name= Thursday 

Есть функция или SQL, что я могу получить помощь для создания даты григорианского ISO-8601 таблица?
Я ищу автогенератор, если это возможно. Любая помощь в этом направлении будет оценена по достоинству.

+0

для меня ваш вопрос не ясно –

+0

Вы хотите автоматически создавать все строки для указанных столбцов из указанной даты (напр: '1/1/2015') –

+0

Http: //www.postgresql. org/docs/9.1/static/functions-datetime.html –

ответ

3

смотрите пример ниже

SELECT mydate calendar_date 
    ,EXTRACT(WEEK FROM mydate) week_num 
    ,EXTRACT(month FROM mydate) month_num 
    ,to_char(mydate,'Mon') month_name 
    ,EXTRACT(Quarter FROM mydate) quarter_num 
    ,EXTRACT(year FROM mydate) calendar_year 
    ,EXTRACT(DOW FROM mydate) iso_dayofweek 
    ,to_char(mydate, 'day') dayofweek_name 
FROM (
    SELECT now()::DATE mydate 
    ) t 

Результат:

calendar_date week_num month_num month_name quarter_num calendar_year iso_dayofweek dayofweek_name 
------------- -------- --------- ---------- ----------- ------------- ------------- -------------- 
2015/04/24 17  4   Apr  2   2015   5    friday  

Вы можете использовать generate_series(), чтобы получить все даты в год для экс: 2015

select generate_series(0,364) + date'1/1/2015' 

это будет производить дату от 1/1/2015 - 31/12/2015, и используйте это выберите вместо SELECT now()::DATE в данном примере

Если вы хотите создать таблицу для 2015 года, то вы можете использовать следующий запрос

CREATE TABLE mycal_2015 AS 
SELECT row_number() OVER() date_key 
    ,mydate calendar_date 
    ,EXTRACT(WEEK FROM mydate) week_num 
    ,EXTRACT(month FROM mydate) month_num 
    ,to_char(mydate,'Mon') month_name 
    ,EXTRACT(Quarter FROM mydate) quarter_num 
    ,EXTRACT(year FROM mydate) calendar_year 
    ,EXTRACT(DOW FROM mydate) iso_dayofweek 
    ,to_char(mydate, 'day') dayofweek_name 
FROM (
    SELECT generate_series(0, 364) + DATE '1/1/2015' mydate 
    ) t 

и таблица будет выглядеть select * from mycal_2015

date_key calendar_date week_num month_num month_name quarter_num calendar_year iso_dayofweek dayofweek_name 
-------- ------------- -------- --------- ---------- ----------- ------------- ------------- -------------- 
1  2015/01/01 1  1   Jan  1   2015   4    thursday  
2  2015/01/02 1  1   Jan  1   2015   5    friday   
3  2015/01/03 1  1   Jan  1   2015   6    saturday  
4  2015/01/04 1  1   Jan  1   2015   0    sunday   
5  2015/01/05 2  1   Jan  1   2015   1    monday   
6  2015/01/06 2  1   Jan  1   2015   2    tuesday   
... 
. 
. 
. 
364  2015/12/30 53  12  Dec  4   2015   3    wednesday  
365  2015/12/31 53  12  Dec  4   2015   4    thursday  

POSTGRESQL: ЭКСТРАКТНАЯ ФУНКЦИЯ

Функция Экстракт PostgreSQL извлекает части из даты

Синтаксис: extract(unit from date)

дата является дата, отметка времени, времени или значение интервала, из которого дата часть должна быть извлечена.

блока является блок типа интервала, таких как день, месяц, минута, часов, и так далее

Это может быть один из следующих:

unit   description                             
--------------- ----------------------------------------------------------------------------------------------------------------------------- 
century    Uses the Gregorian calendar where the first century starts at '0001-01-01 00:00:00 AD'          
day     Day of the month (1 to 31)                         
decade    Year divided by 10                           
dow     Day of the week (0=Sunday, 1=Monday, 2=Tuesday, ... 6=Saturday)                
doy     Day of the year (1=first day of year, 365/366=last day of the year, depending if it is a leap year)       
epoch    Number of seconds since '1970-01-01 00:00:00 UTC', if date value. Number of seconds in an interval, if interval value   
hour    Hour (0 to 23)                            
isodow    Day of the week (1=Monday, 2=Tuesday, 3=Wednesday, ... 7=Sunday)                
isoyear    ISO 8601 year value (where the year begins on the Monday of the week that contains January 4th)        
microseconds  Seconds (and fractional seconds) multiplied by 1,000,000                  
millennium   Millennium value                            
milliseconds  Seconds (and fractional seconds) multiplied by 1,000                   
minute    Minute (0 to 59)                            
month    Number for the month (1 to 12), if date value. Number of months (0 to 11), if interval value         
quarter    Quarter (1 to 4)                            
second    Seconds (and fractional seconds)                        
timezone   Time zone offset from UTC, expressed in seconds                    
timezone_hour  Hour portion of the time zone offset from UTC                     
timezone_minute  Minute portion of the time zone offset from UTC                    
week    Number of the week of the year based on ISO 8601 (where the year begins on the Monday of the week that contains January 4th) 
year    Year as 4-digits                            

Примечания: функция экстракт применяется к PostgreSQL версии 8.4 и выше

Date/Time Functions and Operators
generate_series()

+0

прохладный. теперь это имеет смысл. поэтому, я предполагаю, хочу ли я создать многолетнюю ценность. как бы я это сделал? какой-то курсор или цикл? – noober

+0

Eww ... использовать plruby или что-то с более чистой семантикой, чем это. – hd1

+0

@noober: используйте 'generate_series()' http://www.postgresql.org/docs/current/static/functions-srf.html –