to_char и to_date

В таблице дата хранится в формате timestamp и может содержать не только дату но и часы.
Делаю выборку количества по дням
SELECT
to_char(data1, 'DD.MM.YYYY') as d1,
COUNT( DISTINCT fio)
FROM
t1
WHERE .......
GROUP BY d1

Все работает ка надо, но даты в разнобой

Пытаюсь добавить сортировку

ORDER BY to_date(d1,'DD.MM.YYYY')

и получаю ответ - ОШИБКА: колонка "d1" не существует

Хотя просто ORDER BY d1
работает но результат, естественно не тот.

В чем ошибка?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Надо писать: ORDER BY

Надо писать:

ORDER BY to_char(data1, 'DD.MM.YYYY')

или

ORDER BY 1

Можно , но он сортирует

Можно , но он сортирует так:
1.07
1.08
2.06
2.07
2.08

и т.д.
функцией to_date хотелось вернуть на это время дату к нормальному виду.

Можно и вместо to_char() в SELECT использовать date(). Так работает, но тогда вывод в формате по умолчанию идет, некрасивый :(

"Можно , но он сортирует

"Можно , но он сортирует так:" - это нормально т.к. to_char возвращает символьное значение
используйте в select to_char, а в order date

Можно чуть подробнее, как для

Можно чуть подробнее, как для чайника.
Я не очень понял - колонки с исходной датой же у меня нет. И сортировать по ней после группировки я не могу, ошибка выходит.
Мне тогда надо добавлять колонку с data() в Select?

WITH q AS (VALUES (timestamp

WITH q AS (VALUES (timestamp '2015-01-01 23:59:59'))
SELECT to_char(column1, 'dd.mm.yyyy') FROM q ORDER BY date_trunc('day', column1)

Понял, как изначальный запрос

Понял, как изначальный запрос поправить - надо еще date(data1) в GROUP BY добавить. Тогда можно сортировать.

Спасибо.

WITH q AS (VALUES (timestamp

WITH q AS (VALUES (timestamp '2015-01-01 23:59:59') UNION ALL
           VALUES (timestamp '2015-01-02 23:59:59') UNION ALL
           VALUES (timestamp '2015-02-01 23:59:59') UNION ALL
           VALUES (timestamp '2015-02-02 23:59:59') UNION ALL
           VALUES (timestamp '2015-03-01 23:59:59') UNION ALL
           VALUES (timestamp '2015-03-02 24:00:00')
           )
SELECT to_char(column1, 'dd.mm.yyyy'), count(1) FROM q GROUP BY 1 ORDER BY  to_char(column1, 'dd.mm.yyyy')::date

Ага, так тоже

Ага, так тоже интересно.
Спасибо.
В описании функции такой вещи как "два двоеточия и дате" не увидел :((

форум переводит в картинку-смайлик::date

cast (to_char(column1,

cast (to_char(column1, 'dd.mm.yyyy') as date)

Хм... и так работает!

Хм... и так работает!

да, это к тому, что нужно

да, это к тому, что нужно искать функцию cast, а не date

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023