Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DATETIME-CURRENT / 25 сообщений из 27, страница 1 из 2
10.01.2008, 10:12
    #35051889
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
не получается создать запрос, который выводил бы все даты за следующий месяц имеющиеся в таблице.
Есть вот такой запрос, он просто выводит нужную мне информацию:

$result = pg_Exec ($conn, "SELECT state, name, surname, date, id, vocation, stucture, company, photo, mail from information order by date;");


Но мне необходимо что бы скрипт запущенный кроном в определенное время (каждое 29 число месяца) выдавалбы мне эту информацию на следующий месяц.
Уже почитал: http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT, но че то не совсем понял! =( Подскажите как мне изменить запрос. Спасибо.
...
Рейтинг: 0 / 0
10.01.2008, 12:40
    #35052454
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomне получается создать запрос, который выводил бы все даты за следующий месяц имеющиеся в таблице.
Есть вот такой запрос, он просто выводит нужную мне информацию:

$result = pg_Exec ($conn, "SELECT state, name, surname, date, id, vocation, stucture, company, photo, mail from information order by date;");


Но мне необходимо что бы скрипт запущенный кроном в определенное время (каждое 29 число месяца) выдавалбы мне эту информацию на следующий месяц.
Уже почитал: http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT, но че то не совсем понял! =( Подскажите как мне изменить запрос. Спасибо.
Нифига не понял... Может имелось в виду вот это?
select * from information where date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)
...
Рейтинг: 0 / 0
10.01.2008, 13:01
    #35052561
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Мне из таблицы information нужно взять информацию из столбцов: state, name, surname, date, id, vocation, stucture, company, photo, mail

поле дата это определенные даты событий. так вот мне нужны именно те даты которые будут в следующем месяце. т.е. (на пример) все праздники которые состоятся в феврале.


select * from information where date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)

а можно по подробней об этом запросе что тут к чему?
...
Рейтинг: 0 / 0
10.01.2008, 13:18
    #35052629
Rastafarra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Код: plaintext
where date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)
вот эта бня и есть условие, за счет которого выберутся все записи за следующий месяц.
только вместо вашего перечисления полей тут написано
Код: plaintext
select * from information
...
Рейтинг: 0 / 0
10.01.2008, 18:51
    #35053984
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
"select * from informationwhere date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval);");
А можно по подробнее?
Что означает вот это:
date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)

я так предполагаю, что берется текущая дата и увеличивается на месяц, но какой формат даты?
у меня в БД он день.месяц.год
...
Рейтинг: 0 / 0
11.01.2008, 07:07
    #35054589
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choom"select * from informationwhere date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval);");
А можно по подробнее?
Что означает вот это:
date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)

я так предполагаю, что берется текущая дата и увеличивается на месяц, но какой формат даты?
у меня в БД он день.месяц.год
Лучше для себя разобрать это по функциям и понять, что к чему. Все указанные функции есть в документации: 9.9. Date/Time Functions and Operators.

Now() - возвращает текущую дату и время можешь заменить на что-нибудь свое '2007-12-15'::Date
Date_Trunc(VARCHAR, TIMESTAMP) - Обрезает дату. В данном случае до первого числа месяца 00:00:00.
TIMESTAMP + INTERVAL = TIMESTAMP - операция увеличения текущего даты/времени на интервал. В данном случае - на 1 месяц.

Итого, в правой части я беру текущую дату, увеличиваю ее на 1 месяц, обрезаю до 1 числа месяца и сравниваю с левой частью, где я дату так же обрезаю по 1-е число месяца.
...
Рейтинг: 0 / 0
11.01.2008, 07:14
    #35054595
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomя так предполагаю, что берется текущая дата и увеличивается на месяц, но какой формат даты? у меня в БД он день.месяц.год
Если вы имеете в виду, что у вас поле типа Date или TimeStamp, то вы ошибаетесь, формат даты у вас не "день.месяц.год", а четырехбайтное (восьми для timestamp) число. А вот отображение даты может быть уже каким угодно, в том числе и "день.месяц.год.", причем это зависит не от сервера, а от клиента.
А вот постгресу дату лучше передавать в таком виде:
'2001-09-28 01:00:00'::TimeStamp
'2001-09-28'::Date
...
Рейтинг: 0 / 0
11.01.2008, 14:26
    #35056004
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Просто у меня в базе уже много записей с форматом день.месяц.год, все их переделывать не возможно, может это как то можно обойти?
...
Рейтинг: 0 / 0
12.01.2008, 10:25
    #35057416
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomПросто у меня в базе уже много записей с форматом день.месяц.год, все их переделывать не возможно, может это как то можно обойти?
Тип поля какой? TEXT? VARCHAR? Если так, то лучше все-таки не полениться и один раз все переделать.
Например, так.
ALTER TABLE "public"."a_test"
ALTER COLUMN "datum" TYPE DATE
USING (substr(datum, 7, 4) || '-' || substr(datum, 4, 2) || '-' || substr(datum, 1, 2))::Date;
...
Рейтинг: 0 / 0
14.01.2008, 12:59
    #35059608
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Тип поля text.

а что делают эти команды:
Код: plaintext
1.
2.
3.
ALTER TABLE "public"."a_test"
ALTER COLUMN "datum" TYPE DATE
USING (substr(datum,  7 ,  4 ) || '-' || substr(datum,  4 ,  2 ) || '-' || substr(datum,  1 ,  2 ))::Date;
Приводят поле к нужному формату?
...
Рейтинг: 0 / 0
14.01.2008, 13:47
    #35059807
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomТип поля text.

а что делают эти команды:
Приводят поле к нужному формату?

Может стоит почитать документацию, все-таки?
Код: plaintext
1.
ALTER TABLE "public"."a_test"
Изменить таблицу, а именно:
Код: plaintext
1.
ALTER COLUMN "datum" TYPE DATE
Присвоить полю "datum" тип данных DATE, при этом,
Код: plaintext
1.
USING (substr(datum,  7 ,  4 ) || '-' || substr(datum,  4 ,  2 ) || '-' || substr(datum,  1 ,  2 ))::Date;
изменить значения, которые там валаются посредством вот такой вот хитрой функции.

очень рекомендую сначала посмотреть
Код: plaintext
1.
2.
SELECT datum, (substr(datum,  7 ,  4 ) || '-' || substr(datum,  4 ,  2 ) || '-' || substr(datum,  1 ,  2 ))::Date
FROM a_Test

Если не преобразовать поле в дату, все преобразования текста в дату придется проделывать уже в самих запросах. Индексы создавать соответствующие, короче проблем и тормозов не обрешься.
...
Рейтинг: 0 / 0
14.01.2008, 14:31
    #35059968
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Если сделать типа данных date то некоторые скрипты, которые связаны с этой таблицей не работают! =((( Может есть какойто способ чтоб оставить тип данных text?

Есть вот скрипт который вытаскивает информацию о датах за несколько дней до наступления. может можно его переделать, чтоб он выводил всю информацию за месяц?

Я понимаю что не правильно ставлю вопрос. Но сам я не могу врубиться. Документацию читаю, но не все понимаю! Если не трудно подмагните немножко!
...
Рейтинг: 0 / 0
14.01.2008, 14:38
    #35059989
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomЕсли сделать типа данных date то некоторые скрипты, которые связаны с этой таблицей не работают! =((( Может есть какойто способ чтоб оставить тип данных text?

Есть вот скрипт который вытаскивает информацию о датах за несколько дней до наступления. может можно его переделать, чтоб он выводил всю информацию за месяц?

Я понимаю что не правильно ставлю вопрос. Но сам я не могу врубиться. Документацию читаю, но не все понимаю! Если не трудно подмагните немножко!
Попробуйте в изначальном условии WHERE, который я предлагал сделать такую шнягу:
Код: plaintext
1.
where date_trunc('month', date::Date) = date_trunc('month', now() + '1 Month'::Interval)
Если не заработает, то придется на ходу преобразовывать через
Код: plaintext
1.
where date_trunc('month', (substr(date,  7 ,  4 ) || '-' || substr(date,  4 ,  2 ) || '-' || substr(date,  1 ,  2 ))::Date) = date_trunc('month', now() + '1 Month'::Interval)
...
Рейтинг: 0 / 0
14.01.2008, 16:09
    #35060342
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomПросто у меня в базе уже много записей с форматом день.месяц.год, все их переделывать не возможно, может это как то можно обойти?

Если сделать типа данных date то некоторые скрипты, которые связаны с этой таблицей не работают! =((( Может есть какойто способ чтоб оставить тип данных text?используйте в выражении where функцию to_date

choomЕсть вот скрипт который вытаскивает информацию о датах за несколько дней до наступлениякакой для этого используется запрос?
...
Рейтинг: 0 / 0
15.01.2008, 06:05
    #35061305
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
[quot LeXa NalBatиспользуйте в выражении where функцию to_date
[/quot]
Кстати, да! Я про нее просклерозил. ;)
Но все-равно тормоз получается. И выражения индексов придется по функциям строить. Если бы дата еще хранилась в виде 20070815, а не передом назад.
...
Рейтинг: 0 / 0
15.01.2008, 10:45
    #35061752
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Вот мой запрос:
Код: plaintext
1.
 $result = pg_Exec ($conn, "select * from information where date_trunc('month', date::Date) = date_trunc('month', now() + '1 Month'::Interval)");

Вот такая вот ошибка вываливается, не пойму в чем опять у меня загвозка.
Код: plaintext
1.
Warning: pg_exec(): Query failed: ERROR: invalid input syntax for type date: "" in /usr/local/www/int_25_proba.php on line  13 
...
Рейтинг: 0 / 0
15.01.2008, 11:13
    #35061880
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Kruchinin Pahan имелось в виду вот это?
select * from information where date_trunc('month', date) = date_trunc('month', now() + '1 Month'::Interval)
это очень плохой стиль. Как с точки зрения поюзания индексов, что, возможно, автору неважно, так и с т.з. разногодности месяцев :).

По возможности надо все вычисления перенсти на параметр, а не тащить их на поля таблицы.
т.е.
Код: plaintext
WHERE "date" > prevmonthlast(now())  AND "date" < nextmonthfirst(now())
- что существенно снизит объем вычислений.


как написать выражения/ф-ии для prevmonthlast(...)/nextmonthfirst(...) - дело десятое -
Код: plaintext
1.
SELECT date_trunc('month',now())::date- 1  AS prev_last
,date_trunc('month',now() + '1 Month'::interval)::date as next_first


, да, и пользуя резервированное слово date для имени (столбца или таблицы или т.п.) не забывайте о пользовании кавычками для имен - снизите вероятность ошибки парсера.
...
Рейтинг: 0 / 0
15.01.2008, 11:17
    #35061893
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
поправочка. нужно таки
WHERE "date" >= thismonthfirst(...) AND "date"<nextmonthfirst(...)

и
date_trunc('month',now())::date AS this_first
соотв-нно
...
Рейтинг: 0 / 0
15.01.2008, 11:22
    #35061917
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Я понимаю что туплю, но как это обьединить в один запрос?
...
Рейтинг: 0 / 0
15.01.2008, 11:27
    #35061945
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
вы уже сообщали, каков тип важего поля date?
(а если текстовый - то каков еще и формат хранения)
...
Рейтинг: 0 / 0
15.01.2008, 11:35
    #35061980
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
ps
если все-тки датный или таймстамптный , то просто соберите всё в одно меcто
Код: plaintext
1.
2.
3.
4.
5.
SELECT *
FROM
  blahblahblah i
WHERE
  i."date">= date_trunc('month',now())::date 
  AND i."date"<date_trunc('month',now() + '1 Month'::interval)::date
...
Рейтинг: 0 / 0
15.01.2008, 13:31
    #35062498
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
В том то и проблема что тип данных text! А меня его уже не получится, так как еще несколько крупных скриптов придется переделать, а я честно говоря даже не знаю как это сделать, потому что еще не разобрался как они работают!!! =(((
...
Рейтинг: 0 / 0
15.01.2008, 14:46
    #35062828
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomВ том то и проблема что тип данных text!
простите пжалста, но вы читаете, что вам пишут?
если да - то почему не отвечаете?

еще раз: будте столь любезны, если поле текстовое, опишите формат хранения даты.

(ну, и, заодно, не просветите - почему нельзя преобразовать это ущербное поле, вернее добавить поле нормального формата, залить в него данные и т.д. и т.п.)
...
Рейтинг: 0 / 0
15.01.2008, 15:53
    #35063128
choom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
Дата заносится в формате дд.мм.гггг.
В поле содержится большое количество данных, каким образом я смогу перенести из в другое?
...
Рейтинг: 0 / 0
16.01.2008, 06:04
    #35064185
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DATETIME-CURRENT
choomДата заносится в формате дд.мм.гггг.
В поле содержится большое количество данных, каким образом я смогу перенести из в другое?

Код:
1.
2.
3.
4.
5.
SELECT *
FROM a_test
WHERE
  to_date(a_test."date", 'DD.MM.YYYY') >= date_trunc('month',now())::date AND 
  to_date(a_test."date", 'DD.MM.YYYY') < date_trunc('month',now() + '1 Month'::interval)::date


Хотя, на больших объемах работать будет медленно. Все-таки рекомендую если пока данных немного, по возможности переделать такие узкие места.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DATETIME-CURRENT / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]