Postgresql формат даты - PullRequest
       5

Postgresql формат даты

0 голосов
/ 29 марта 2011

У меня есть веб-приложение (написанное на python / django), которое (из-за неправильной спецификации) веб-форм ожидает формат даты "ГГГГ-мм-дд", а другие используют формат даты "дд / мм / гг".

Есть ли способ сообщить postgresql, что он принимает даты в обоих форматах? например, попробуйте "дд / мм / гг" и, если это не удастся, то попробуйте "гггг-мм-дд".

Это было бы здорово.

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Из подробного руководства :

Ввод даты и времени допускается практически в любом приемлемом формате, включая ISO 8601, SQL-совместимые, традиционные POSTGRES и другие.Для некоторых форматов упорядочение ввода даты, месяца и года является неоднозначным, и существует поддержка для определения ожидаемого порядка этих полей.Установите для параметра DateStyle значение MDY, чтобы выбрать интерпретацию месяц-день-год, DMY, чтобы выбрать интерпретацию день-месяц-год, или YMD, чтобы выбрать интерпретацию год-месяц-день.

PostgreSQL более гибок в обработке даты /время ввода, чем требует стандарт SQL.См. Приложение B для точных правил разбора ввода даты / времени и для распознанных текстовых полей, включая месяцы, дни недели и часовые пояса.

Таким образом, PostgreSQL должен иметь возможность справляться практически со всемилюбой формат даты вы бросаете на это.Ваш формат "дд / мм / гг", однако, неоднозначен.Но есть параметр конфигурации DateStyle, чтобы помочь с такой неоднозначностью.

Например:

=> create table x (d date not null);
=> insert into x values ('2001-01-10');
=> insert into x values ('Feb 2 2980');
=> insert into x values ('01/02/03');
=> select * from x;
     d      
------------
 2001-01-10
 2980-02-02
 2003-02-01

Тем не менее, я рекомендую переместить все вISO 8601 (ГГГГ-ММ-ДД) для внутренних целей и обработки преобразований по краям приложения.OTOH, есть реальность, с которой нужно бороться, поэтому вы должны делать все, что вам нужно, чтобы все прошло.

2 голосов
/ 29 марта 2011

Если это только два возможных формата, то может быть лучше явно разрешить только те, а не полагаться на postgres для интерпретации.Например:

with w as (select '2011-12-13' as input_date union select '13/12/2011')
select case when input_date~'^\d\d\d\d-\d\d-\d\d$' 
                 then to_date(input_date, 'yyyy-mm-dd')
            when input_date~'^\d\d/\d\d/\d\d\d\d$' 
                 then to_date(input_date, 'dd/mm/yyyy')
            end 
from w;

    case
------------
 2011-12-13
 2011-12-13
(2 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...