The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"unix_timestamp() в PostgreSQL"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [Проследить за развитием треда]

"unix_timestamp() в PostgreSQL"
Сообщение от crox Искать по авторуВ закладки on 01-Июл-03, 06:51  (MSK)
Подскажите плиз, как в PostgreSQL 7.3.3 реализовать эквивалент функции MySQL unix_timestamp. Надо unix_timestamp(now())

Перерыл всю доку на постгрес и нихрена не нашел. Нету или я хреново искал?!

Заранее благодарен!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 01-Июл-03, 07:30  (MSK)
>Подскажите плиз, как в PostgreSQL 7.3.3 реализовать эквивалент функции MySQL unix_timestamp. Надо
>unix_timestamp(now())
>
>Перерыл всю доку на постгрес и нихрена не нашел. Нету или я
>хреново искал?!

Не то чтобы хреново, просто немного не то искал...

Посмотри чего получится:
SELECT date_part('epoch', timestamp 'now');

И фантазируй дальше сам. :)

>
>Заранее благодарен!


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "unix_timestamp() в PostgreSQL"
Сообщение от crox Искать по авторуВ закладки on 01-Июл-03, 10:22  (MSK)

>Посмотри чего получится:
>SELECT date_part('epoch', timestamp 'now');

Клёво! Работает! :)

Я конечно жутко извинясь за свою нескромность, но помогите мне плиз еще раз!

Решил чтобы меньше переделывать запросы реализовать функцию unix_timestamp на языке PL/pgSQL в PostgreSQL:

CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS '$libdir/plpgsql' LANGUAGE C;

CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler;

CREATE FUNCTION unix_timestamp(timestamp) RETURNS integer AS '
DECLARE
    i integer DEFAULT 0;
BEGIN
    i := date_part(''epoch'', TIMESTAMP ''$1'');
    RETURN i;
END;
' LANGUAGE plpgsql;

Однако при попытке выполнить SELECT unix_timestamp('now'); получаю:
WARNING:  Error occurred while executing PL/pgSQL function unix_timestamp
WARNING:  line 4 at assignment
ERROR:  Bad timestamp external representation '$1'

Где грабли скажите?!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Re: unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 01-Июл-03, 11:01  (MSK)
>Я конечно жутко извинясь за свою нескромность, но помогите мне плиз еще
>раз!
>
>Решил чтобы меньше переделывать запросы реализовать функцию unix_timestamp на языке PL/pgSQL в
>PostgreSQL:
>
>CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS '$libdir/plpgsql' LANGUAGE C;
>
>CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler;
>
>CREATE FUNCTION unix_timestamp(timestamp) RETURNS integer AS '
>DECLARE
>    i integer DEFAULT 0;
>BEGIN
>    i := date_part(''epoch'', TIMESTAMP ''$1'');
>    RETURN i;
>END;
>' LANGUAGE plpgsql;
>
>Однако при попытке выполнить SELECT unix_timestamp('now'); получаю:
>WARNING:  Error occurred while executing PL/pgSQL function unix_timestamp
>WARNING:  line 4 at assignment
>ERROR:  Bad timestamp external representation '$1'
>
>Где грабли скажите?!


О!!! Как далеко Вас уважаемый понесло! Зачем такие "умности" делать, ради такой маленькой проблемы? :)

CREATE FUNCTION unix_timestamp(TIMESTAMP) RETURNS INTEGER AS '
SELECT date_part(''epoch'', $1::timestamp)::INTEGER AS RESULT
' LANGUAGE sql;

SELECT unix_timestamp(now()::timestamp);
unix_timestamp
----------------
     1057042468
(1 запись)

SELECT unix_timestamp('now()');
unix_timestamp
----------------
     1057042475
(1 запись)

SELECT unix_timestamp('now');
unix_timestamp
----------------
     1057042478
(1 запись)

Работает вроде на PostgreSQL 7.3.3, можно узнать зачем тут PL/pgSQL? :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Re: unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 01-Июл-03, 21:06  (MSK)

>CREATE FUNCTION unix_timestamp(TIMESTAMP) RETURNS INTEGER AS '
>SELECT date_part(''epoch'', $1::timestamp)::INTEGER AS RESULT
>' LANGUAGE sql;

В свете предыдущего письма могу предположить, что у тебя заело с излишней типизацией. передаваемый параметр ($1) уже явно определен как TIMESTAMP и второй раз указывать его тип не нужно.

CREATE FUNCTION unix_timestamp(TIMESTAMP) RETURNS INTEGER AS '
SELECT date_part(''epoch'', $1)::INTEGER AS RESULT
' LANGUAGE sql;
CREATE FUNCTION

$ SELECT unix_timestamp(now()::timestamp);
unix_timestamp
----------------
     1057078972
(1 row)

$ SELECT unix_timestamp('now()');
unix_timestamp
----------------
     1057078977
(1 row)

$ SELECT unix_timestamp('now');
unix_timestamp
----------------
     1057078981

$ SELECT unix_timestamp( '2004-01-01 01:01:01');
unix_timestamp
----------------
     1072900861
(1 row)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Re: unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 02-Июл-03, 05:09  (MSK)

>В свете предыдущего письма могу предположить, что у тебя заело с излишней
>типизацией. передаваемый параметр ($1) уже явно определен как TIMESTAMP и второй раз указывать его тип не нужно.

Это сильно кому-то мешает? :) Или надо обязательно, как ты, постоянно ломать голову, где надо типизировать, а где не надо? :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Re: unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 02-Июл-03, 11:02  (MSK)
>Это сильно кому-то мешает? :) Или надо обязательно, как ты, постоянно ломать
>голову, где надо типизировать, а где не надо? :)

Это демонтсрация того, что не следует предвзято относится к текстам других посетителей, когда у самого всплывают недочеты.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Re: unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 03-Июл-03, 04:42  (MSK)
>>Это сильно кому-то мешает? :) Или надо обязательно, как ты, постоянно ломать
>>голову, где надо типизировать, а где не надо? :)
>
>Это демонтсрация того, что не следует предвзято относится к текстам других посетителей,
>когда у самого всплывают недочеты.

Мда уж... Флудить так флудить.

1. Может для тебя недочет, для себя я в этом вижу только положительную сторону. При указании типа в коде я всегда вижу, что имеется ввиду, и смотреть на такой код мне будет проще через 2-3 месяца. Речь идет не об этом халявном запросе, который здесь обсуждается, но привычка выработана, и даже в такой простом запросе проявляется. И недостатка в этом, я абсолютно не вижу.

2. Еще раз повторяю, что нужен был эквивалент функции unix_timestamp. В случае указания типа timestamp проблем точно не будет. Чего нельзя сказать о случае его не указывания.

Сплошь и рядом в скриптах PHP и Perl можно видеть строку - $sql = "... unix_timestamp('".$variable."') ..."; Что в переводе на PSQL будет выглядеть, как - $sql = " ... date_part('epoch', timestamp '".$variable."') ...";

И где тут недочет в случае указания типа, ткни меня пожалуйста? Как раз проблемы вылезут в случае если его не будет.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "Re: to_days() в PostgreSQL"
Сообщение от crox Искать по авторуВ закладки on 03-Июл-03, 10:33  (MSK)
ivi, мне абсолютно не мешает твоя излишняя типизация. uldus, и твоя нелюбовь к типизации мне тоже не мешает. Я что-то не догоняю из-за чего в принципе спор? Кто хочет пусть указывает типы, кто не хочет - не указывает. Кому как удобнее. Какая разница? Главное результат и что-бы работало без ошибок, на пять с плюсом. :)

Ну и попробую набраться наглости и спросить про to_days()

Господа, вместо того чтобы спорить из-за такой ерунды скажите как to_days() в постгресе будет выглядеть?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

16. "Re: to_days() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 03-Июл-03, 10:53  (MSK)
>ivi, мне абсолютно не мешает твоя излишняя типизация. uldus, и твоя нелюбовь
>к типизации мне тоже не мешает. Я что-то не догоняю из-за
>чего в принципе спор? Кто хочет пусть указывает типы, кто не
>хочет - не указывает. Кому как удобнее. Какая разница? Главное результат
>и что-бы работало без ошибок, на пять с плюсом. :)

Это религия и ничего здесь не поделаешь. ;) К тому же настроение для флуда редко появляется, так что надо ловить момент. ;)

>Ну и попробую набраться наглости и спросить про to_days()

Надо не наглости набираться, а ума, читая хотя бы изредка документацию.
Тут ведь элементарное вычитание.

>Господа, вместо того чтобы спорить из-за такой ерунды скажите как to_days() в постгресе будет выглядеть?

Щас меня некоторые закидают шапками за СУПЕРТИПИЗАЦИЮ! %)))

CREATE FUNCTION to_days(DATE) RETURNS INTEGER AS 'SELECT ($1::DATE - ''0000-01-01''::DATE)::INTEGER AS RESULT' LANGUAGE sql;

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 01-Июл-03, 11:03  (MSK)
>Подскажите плиз, как в PostgreSQL 7.3.3 реализовать эквивалент функции

Вывод: date_part('epoch', field) AS field
Ввод: 'epoch'::timestamp + 'время sec'::interval

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 01-Июл-03, 11:38  (MSK)
>>Подскажите плиз, как в PostgreSQL 7.3.3 реализовать эквивалент функции
>
>Вывод: date_part('epoch', field) AS field
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Сам то пробовал так? TIMESTAMP нигде не пропустил?

SELECT date_part('epoch', '2004-01-01 01:01:01') AS field;
ERROR:  Функция date_part("unknown", "unknown") не существует
        Unable to identify a function that satisfies the given argument types
        You may need to add explicit typecasts

SELECT date_part('epoch', timestamp '2004-01-01 01:01:01') AS field;
   field
------------
1072890061
(1 запись)

>Ввод: 'epoch'::timestamp + 'время sec'::interval

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 01-Июл-03, 21:00  (MSK)
>>Вывод: date_part('epoch', field) AS field
>SELECT date_part('epoch', '2004-01-01 01:01:01') AS field;

С каких это пор поле таблицы превратилось в константу (где ты видишь кавычки вокруг field) ?

>ERROR:  Функция date_part("unknown", "unknown") не существует

Теперь внимательно перечитай сообщение на которое ты отвечаешь, и попробуй найти  упоминание о нетипизированной подстановке параметров. Типизация констант - это аксиома.

Перефразирую:
Ввод epoch  числа в базу:
'epoch'::timestamp + '1056227401 sec'::interval

Вывод в epoch формате из базы для существующего поля таблицы:
date_part('epoch', field) AS field

$ \d table
   Column    |           Type           |         Modifiers          
-------------+--------------------------+----------------------------
field       | timestamp with time zone | not null default 'now'


  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 02-Июл-03, 05:02  (MSK)

>Теперь внимательно перечитай сообщение на которое ты отвечаешь, и попробуй найти  
>упоминание о нетипизированной подстановке параметров. Типизация констант - это аксиома.

Читаю: "... эквивалент функции MySQL unix_timestamp.". А вот где шла речь о полях таблиц БД, я точно не вижу. ;)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 02-Июл-03, 11:00  (MSK)
>
>>Теперь внимательно перечитай сообщение на которое ты отвечаешь, и попробуй найти  
>>упоминание о нетипизированной подстановке параметров. Типизация констант - это аксиома.
>
>Читаю: "... эквивалент функции MySQL unix_timestamp.". А вот где шла речь о
>полях таблиц БД, я точно не вижу. ;)

Это цитита из другого сообщения, что касаеся unix_timestamp, смотрите, там ни о какой привязке к константам нет:

http://www.mysql.com/doc/en/Date_and_time_functions.html

UNIX_TIMESTAMP(date)
    If called with no argument, returns a Unix timestamp (seconds since '1970-01-01 00:00:00' GMT) as an unsigned integer. If UNIX_TIMESTAMP() is called with a date argument, it returns the value of the argument as seconds since '1970-01-01 00:00:00' GMT. date may be a DATE string, a DATETIME string, a TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD in local time:

mysql> SELECT UNIX_TIMESTAMP();
        -> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580

When UNIX_TIMESTAMP is used on a TIMESTAMP column, the function will
>--------------------------------^^^^^^^^^^^^^^^^^
return the internal timestamp value directly, with no implicit ``string-to-unix-timestamp'' conversion. If you pass an out-of-range date to UNIX_TIMESTAMP() it will return 0, but please note that only basic checking is performed (year 1970-2037, month 01-12, day 01-31). If you want to subtract UNIX_TIMESTAMP() columns, you may want to cast the result to signed integers.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "unix_timestamp() в PostgreSQL"
Сообщение от ivi Искать по авторуВ закладки on 03-Июл-03, 05:15  (MSK)
>Это цитита из другого сообщения, что касаеся unix_timestamp, смотрите, там ни о
>какой привязке к константам нет:
>
>http://www.mysql.com/doc/en/Date_and_time_functions.html
>
>UNIX_TIMESTAMP(date)
>    If called with no argument, returns a Unix
>timestamp (seconds since '1970-01-01 00:00:00' GMT) as an unsigned integer. If
>UNIX_TIMESTAMP() is called with a date argument, it returns the value
>of the argument as seconds since '1970-01-01 00:00:00' GMT. date may
>be a DATE string, a DATETIME string, a TIMESTAMP, or a
>number in the format YYMMDD or YYYYMMDD in local time:
>
>mysql> SELECT UNIX_TIMESTAMP();
>        -> 882226357
>mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
>        -> 875996580
>
>When UNIX_TIMESTAMP is used on a TIMESTAMP column, the function will
>>--------------------------------^^^^^^^^^^^^^^^^^
>return the internal timestamp value directly, with no implicit ``string-to-unix-timestamp'' conversion. If
>you pass an out-of-range date to UNIX_TIMESTAMP() it will return 0,
>but please note that only basic checking is performed (year 1970-2037,
>month 01-12, day 01-31). If you want to subtract UNIX_TIMESTAMP() columns,
>you may want to cast the result to signed integers.

Мы обсуждаем MySQL или PostgreSQL?
См. п. 2 на http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=show_thread&om=1476&forum=vsluhforumID8&omm=12

Чтобы тратилось меньше времени давай флудить в одну ветку? :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "unix_timestamp() в PostgreSQL"
Сообщение от uldus Искать по авторуВ закладки on 03-Июл-03, 10:08  (MSK)
>Мы обсуждаем MySQL или PostgreSQL?

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру