2013-04-02 4 views
-1

Я хочу рассчитать между двумя датами.расчет между двумя датами в postgresql

create table greatestdate(name varchar(20),city varchar(20),current_dates varchar(12),previous_date varchar(12));// create table 



insert into greatestdate values('samuel','newyork','02-04-2013','01-01-2013'); //insert values 

select * from greatestdate where (current_dates -previous_date)> 2 months as result; 

однако iam получение ошибка синтаксиса. любезно прошу, чтобы кто-нибудь предложил мне.

я попробовал этот код,

select * from greatestdates where (now() - previous_date) < interval '2 month'; 

получаю сообщение об ошибке, как,

ОШИБКА: оператор не существует: целое < интервал ЛИНИЯ 1: ... atestdates где (current_dates - previous_date) < интервал ... ^ СОВЕТ. Оператор не соответствует указанному имени и типам аргументов. Возможно, вам придется добавлять явные типы.

я использую PostGreSQL 9.2 версии,

+0

Если вы задаете вопрос PostgreSQL, не применяйте теги для других баз данных. Если вы хотите задать вопрос, относящийся к SQL Server и/или Oracle, отредактируйте свой вопрос, чтобы показать, как он относится к этим базам данных. –

+0

«Я получаю синтаксическую ошибку». Какая ошибка * точно *? При каком заявлении? Какая версия PostgreSQL? ** Всегда показывать точный текст сообщений об ошибках **. –

+0

Также, это домашнее задание? –

ответ

2

Полная ошибка:

regress=> select * from greatestdate where (current_dates -previous_date)> 2 months as result; 
ERROR: syntax error at or near "months" 
LINE 1: ...atestdate where (current_dates -previous_date)> 2 months as ... 
                  ^

Проблема заключается в том, что вы написали:

2 months 

, где вы должны написать:

INTERVAL '2' MONTH 

или:

CAST('2 months' AS interval) 

См. Синтаксис интервалов в руководстве пользователя.

Как только вы исправите это, вы найдете еще одну проблему: вы пытаетесь применить псевдоним as к статье WHERE. Это бессмысленно. Удалите as result целиком.

Это покажет третью проблему: вы пытаетесь вычесть два столбца varchar. Это не имеет смысла и не будет работать. Исправьте свою схему, чтобы использовать date, timestamp without time zone или timestamp with time zone для полей даты вместо их хранения как varchar. Как только определение таблицы будет исправлено, оператор должен, наконец, работать. Хранение дат как varchar никогда не является хорошей идеей.

В будущем, пожалуйста, покажите свою версию PostgreSQL и точный текст сообщения об ошибке во всех вопросах.

+0

однако я пробовал этот код и использовал posgresql 9.2 version выберите * from greatdate где (current_dates -previous_date) Patrick

+0

i изменен тип данных как дата вместо varchar – Patrick

+0

@Patrick Пожалуйста, отредактируйте свой вопрос, чтобы добавить новый код и новое сообщение об ошибке. 't замените старый, просто добавьте новый материал в конец. Трудно понять, что происходит в комментариях, где нет форматирования. Комментарий здесь, когда вы закончите. –

0

Это последняя ошибка, после тщательного отслеживания ошибок по @Craig,

ERROR: operator does not exist: integer < interval LINE 1: 
...atestdates where (current_dates - previous_date) < interval... 
^ HINT: No operator matches the given name and argument type(s). 
You might need to add explicit type casts. 

происходит потому, что дата типа арифметической возвращает целое число, не интервал. Во избежание этого:

select * 
from greatestdates 
where current_dates - interval '2 month' > previous_date; 
+0

Я получил ответ для этого запроса, был выбран, выберите * от величайшего s где (now() - previous_date) между интервалом «0 месяц» и «2 месяца», он работает очень хорошо. – Patrick

Смежные вопросы