1

Temat: round, trunc

Witam
Mam pole w tabeli typu Real lub Double Precision z wartością np 0,123456

wywołuje zapytanie które ma zaokrąglić tą wartość

select round(wartosc,2) from tabela
ale trunc i round zwracają błędy.

ERROR:  function round(double precision, integer) does not exist
LINE 1: select round(wartosc,2) from tabela
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.


Zauważyłem, że do round potrzebna jest liczba z kropką nie przecinkiem round(32.2345,2) działa.
Jednak pole w tabeli automatycznie nadaje przecinek zamiast kropki.

I jeszcze pytanko do czego jest typ Numeric, kiedy go zastosuję to już całkiem cyrki w tabeli.

Z góry dzięki za odpowiedź
Adam

Ostatnio edytowany przez adamleon (2009-09-03 11:52:17)

2

Odp: round, trunc

Już rozwiązałem problem

select round(CAST (wartosc AS numeric),2) from tabela

Ale ten Numeric dalej mnie interesuje, wpisując w tym polu np: 0,1234 po wyswietleniu dostaje 0

3

Odp: round, trunc

postgres=# select * from test;
   i   
-------
 1.222
 0.111
(2 rows)

round z jedym parametrem zaokragla do najbliższej liczby całkowitej

postgres=# select round(i::numeric) from test;
 round 
-------
     1
     0
(2 rows)

Ale mozesz mu podac drugim parametrem do ilu miejsc po przecinku ma zaokraglic

postgres=# select round(i::numeric,2) from test;
 round 
-------
  1.22
  0.11
(2 rows)

4

Odp: round, trunc

dzięki,

ale nadal typ pola Numeric mnie interesuje, dodatkowo rzutowanie :: u mnie nie działa, mam wersje 8.3.

Znalazłem taki opis w książce "Beginning Databases with PostgreSQL" -->>  "The syntax with :: is historical PostgreSQL usage, as is the function-call syntax." z tego co rozumiem to chyba w nowszych wersjach :: zastapiono cast. Jeżeli się mylę to proszę mnie poprawić.

5

Odp: round, trunc

W 8.3.7 :: wciaz dziala (w psql nie mam zadnych problemow). Uzywasz pgadmina?  to pewnie jego problem.
Co za cyrki z tym numeric?

6

Odp: round, trunc

Uzywam EMS SQL Manager 2007

Z Numeric już sobie poradziłem, ale zapytam czy do liczb np: 123,324 lub 0,321 uzywać Numeric czy Real??
I jeszcze jedno, w jakiejś książce widziałem pole Rok Typu Smallint, czy do tego pola rok nie lepiej uzywać Char lub Varchar?
Kiedyś uczono mnie że jeżeli nie wykonuje na polu operacji matematycznych to lepiej stosować typy tekstowe.

7

Odp: round, trunc

W numericu masz większą kontrolę na ilością cyfr dziesiętnych bo sam sobie to definiujesz, real z góry zakłada 6 cyfr dziesiętnych.
No to zależy czy na roku nie wykonujesz nie bedziesz wykonywal operacji (chociaz jak dasz varchar to i tak mozna potem spróbowac zrzutować). Wszystko rozbija sie o ilosc pamieci zajmowanej przez zmienne, smallint=2bajty varchar moze byc większy. No i jeszcze jedna rzecz w smallint wstawiasz rok z przedzialu -32768 to +32767 wiec informacji o daleeeeeekiej przyszlosci raczej nie bedziesz mógł przechowywac smile.

8

Odp: round, trunc

Operacje na roku to może być np: grupowanie po roku lub rok.tabela1=rok.tabela2, ale czy tu potrzebny smallint? Chyba, że na smallint wykona się to szybciej. Smallint 2 bajty, rok ma 4 cyfry więc char(4) lub varchar(4) może być większy od 2 bajtów?

Do jakich operacji musiałbym rzutować varchar w polu rok? Rozumiem gdyby to było np. pole ilość wtedy się sumuje itp.

9

Odp: round, trunc

Na przykład dla tabeli z samochodami i rokiem produkcji,
1) średni wiek samochodów, czyli operacja matematyczna wykonywana na roku
2) samochody, które są starsze niz jakis samochód x (operacja >, która dla napisów i liczb może inaczej dzialać)
itp itd.

10

Odp: round, trunc

Witam serdecznie,
skoro rok jest czescia daty to moze typ danych data bylby najwlasciwszy?

11

Odp: round, trunc

Tez prawda chyba ze chce indeksowac tylko po roku, jakos indeksy funkcyjne w postgresie tak srednio do mnie przemawiaja ale moze przesadzam.

12

Odp: round, trunc

Dobry przykład z samochodami,

pole daty do roku jakoś nie pasuje ponieważ nie chce przyjąć samego roku krzyczy że niewłaściwy format daty. A rok jest wpisywany jako rok, nie jest wybierany z żadnej daty.

Może coś więcej o indexie funkcyjnym lub jakiś przykład, bo pierwsze o takim słyszę.
( Google : Indeksy funkcyjne, gdzie indeks jest wynikiem funkcji, a nie wartości kolumny)

13

Odp: round, trunc

No to index który nie wisi na kolumnie tylko na jakiejś fukcji deterministycznej np

create index osb_nazw_idx on osoby (upper(nazwisko));

i może być  użyty gry wywolasz zapytanie

select * from osoby where upper(nazwisko)='KOWALSKI';

14

Odp: round, trunc

dzięki