SUBSTR не работает с типом данных “метка времени” в Пост-ГРЭС 8.3

Я думал, для именно это >> был оператор на строковых потоках:

string word; sin >> word;
8
задан Milen A. Radev 7 July 2009 в 13:17
поделиться

4 ответа

Явным решением вашей проблемы является преобразование даты и времени в строку.

..., SUBSTRING (l.createdate :: varchar, ...

Использование результата для сравнения дат - не лучшая практика.

Итак, хорошее решение для вашей потребности - это изменить ваш запрос с помощью явного datetime функции манипулирования, сравнения и форматирования , такие как extract () и to_char ()

Вам нужно будет изменить свой запрос, чтобы он содержал предложение вроде

l.createdate::DATE >= '2009-06-07'::DATE 
AND l.createdate::DATE < '2009-07-08'::DATE;

или одну из альтернатив ниже ( что вам действительно стоит принять вместо этого.)

9
ответ дан 5 December 2019 в 10:04
поделиться
SELECT  u.username, l.description, l.ip,
        CAST(l.createdate AS DATE) as createdate,
        l.action
FROM    n_logs AS l
LEFT JOIN
        n_users AS u
ON      u.id = l.userid
WHERE   l.createdate >= '2009-06-07'::TIMESTAMP
        AND l.createdate < '2009-07-07'::TIMESTAMP + '1 DAY'::INTERVAL
5
ответ дан 5 December 2019 в 10:04
поделиться

I'm not sure what you want to achieve, but basically "substring" on date datatypes is not really well defined, as it depends on external format of said data.

In most of the cases you should use extract() or to_char() functions.

Generally - for returning data you want to_char(), and for operations on it (including comparison) - extract(). There are some cases where this general rule does not apply, but these are usually signs of not really well thought data-structure.

Example:

# select to_char( now(), 'YYYY-MM-DD');
  to_char
------------
 2009-07-07
(1 row)

For extract let's write a simple query that will list all objects created after 8pm:

select * from objects where extract(hour from created) >= 20;
2
ответ дан 5 December 2019 в 10:04
поделиться

Вариант ответа Квассного:

SELECT
    u.username,
    l.description,
    l.ip,
    CAST(l.createdate AS DATE) as createdate,
    l.action
FROM
    n_logs AS l
LEFT JOIN
    n_users AS u
ON
    (u.id = l.userid)
WHERE
    l.createdate::DATE BETWEEN '2009-06-07'::DATE AND '2009-07-07'::DATE
1
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: