2015-03-26 25 views
6

Używam adaptera jdbc postgresql do migrowania pęczku danych do pola jsonb (postgres 9.4).JSONb daty: rzeczywiste daty wewnętrznie?

Po zaimportowaniu pola daty wyglądają prawidłowo, ale są wyświetlane w otoczeniu z podwójnymi cytatami. Czy istnieje sposób na stwierdzenie, czy są one rzeczywiście przechowywane wewnętrznie jako wartości daty? Jeśli są to ciągi, nie sądzę, aby wyszukiwanie zakresów było bardzo wydajne.

Na przykład wpis w properties jsonb pola wygląda następująco:

"founded_on": "Sep 1, 2012 12:00:00 AM",

mogę teraz wyszukiwać za, powiedzmy,

SELECT CAST(properties->>'founded_on' AS DATE

i

SELECT extract('year' from cast(properties->>'founded_on' as timestamp))

i oba działają dobrze, ale nie mów mi, czy Postgres jest w trakcie reparacji wartości łańcucha w polu jsonb za każdym razem, jako datę.

Mogę utworzyć indeks, w którym rzucam te wartości do dat i używam go do wyszukiwania, ale wydaje się nieco nieelegancki. Naprawdę wolałbym wiedzieć, że przechowywana wartość to data. Liczby całkowite i pływaków wydaje się być ich rzeczywiste wartości rodzime, a nie ciągi, jak w nich:

shares_sold": 5900000,

"latitude": 33.561467,

Wszelkie uwagi wysoko cenione.

Odpowiedz

12

JSON nie ma typu "data". Typ JSONB (dodany w Pg 9.4) mapuje ale does not extend upon JSON primitive types. Widoczna wartość jest tym, czym jest, tekstem.

Podczas dodawania indeksu do właściwości ciągu bieżący format "angielskiej prozy" nie będzie mógł uczestniczyć w zapytaniach o zakres , ponieważ takie wartości nie są dobrze uporządkowane w terminach.

Różne sposoby przechowywania dobrze uporządkowanych dat, z uwzględnieniem pierwotnych ograniczeń typu.

(sondy wskaźnika równości może być stosowany nawet jeśli przedziały nie może .. pod warunkiem, że wartości są zgodne dokładnie, która jest wciąż przedmiotem za pomocą jednolitej reprezentacji danych.)

Przy stosowaniu zapytanie zakres nad! Indeks (JSONB/GIN) konwertuje wartości DATE na odpowiedni typ danych JSON (odwzorowany na liczbę całkowitą, numeryczną, tekst w Pg) używany dla właściwości "date"; nie w inny sposób.

Podczas pobierania wartości przekonwertuj wybrany format na DATE - jest "w porządku", ponieważ jest wykonywany po zapytanie dotyczące zakresu i "wymagane", ponieważ JSONB nie obsługuje natywnie dat ani godzin.

+1

Dziękuję, ta odpowiedź jest doskonała. Będziemy używać unixtime wszędzie. –

+1

Również tutaj jest [specyfikacja JSON dla dozwolonych typów] (http://rfc7159.net/rfc7159), jeśli ktokolwiek musi się do tego odwoływać. –

Powiązane problemy