2011-07-26 11 views
12

Mam tabelę z zapisanymi w niej zamówieniami zakupu. Każdy wiersz ma znacznik czasu wskazujący, kiedy zamówienie zostało złożone. Chciałbym móc utworzyć raport wskazujący liczbę zakupów każdego dnia, miesiąca lub roku. Pomyślałem, że zrobiłbym prosty SELECT COUNT (xxx) FROM tbl_orders GROUP BY tbl_orders.purchase_time i otrzymam wartość, ale okazuje się, że nie mogę GROUP BY w kolumnie timestamp.PostgreSQL - GROUP BY wartości znacznika czasu?

Czy istnieje inny sposób, aby to osiągnąć? Idealnie lubiłbym elastyczne rozwiązanie, dzięki czemu mogłem wykorzystać każdy potrzebny okres czasu (co godzinę, co miesiąc, co tydzień itd.) Dzięki za wszelkie sugestie, jakie możesz podać!

+1

Jaki błąd pojawia się przy próbie grupowania według kolumny datownika? Wydaje się, że działa to dobrze, pamiętając, że znaczniki czasu muszą być identyczne (do mikrosekundy lub jakiejkolwiek minimalnej rozdzielczości), które mają zostać zgrupowane. – Anomie

Odpowiedz

11

Grupowanie według kolumny znacznika czasowego działa dobrze dla mnie tutaj, pamiętając, że nawet różnica 1 mikrosekundy uniemożliwi grupowanie razem dwóch wierszy.

Aby pogrupować według większych przedziałów czasowych, należy pogrupować je według wyrażenia w kolumnie znacznika czasu, która zwraca odpowiednio obciętą wartość. date_trunc może być przydatny tutaj, podobnie jak to_char.

+0

Funkcja date_trunc była dokładnie tym, czego szukałem. Dzięki! – Shadowman

15

To działa bez funkcji date_trunc (łatwiejsze do odczytania).

select created_on::DATE from users group by created_on::DATE 

Co robimy tutaj rzuca oryginalną wartość na randkę renderowania danych czasu w tej wartości bez znaczenia.

+1

dokładnie to, czego szukałem, konwertuje na datę podobną do "2016-06-27", łatwe do szybkiego liczenia (*) w ciągu dnia –

+0

Nie sądzę, aby typ sygnatury czasowej Cast na DATE będzie działał w Grupie według, ponieważ jest nie działa dla mnie. – hky404