CAST DECIMAL do INT

81

Próbuję to zrobić:

SELECT CAST(columnName AS INT), moreColumns, etc
FROM myTable
WHERE ...

Przejrzałem często zadawane pytania dotyczące pomocy: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html , mówi, że mogę to zrobić CAST(val AS TYPE), ale to nie działa.

Próbuję zamienić ułamek dziesiętny na int, wartość rzeczywista to 223,00, a chcę 223

Drahcir
źródło
Ostrzeżenie przed rzucaniem jest takie, że dostarczasz strunę, czy możesz to potwierdzić?
ajreal
Działa

Odpowiedzi:

127

Możesz wypróbować funkcję FLOOR w ten sposób:

SELECT FLOOR(columnName), moreColumns, etc 
FROM myTable 
WHERE ... 

Możesz także wypróbować funkcję FORMAT , pod warunkiem, że wiesz, że miejsca po przecinku można pominąć:

SELECT FORMAT(columnName,0), moreColumns, etc 
FROM myTable 
WHERE ... 

Możesz połączyć te dwie funkcje

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 
RolandoMySQLDBA
źródło
2
Zdajesz sobie sprawę, że nie powinieneś zajmować się formatowaniem w swoim kodzie SQL, prawda?
fredley
Dobra robota, +1. Format działa w mojej sytuacji dobrze, ale nadal zastanawiam się, czy ktoś może to zrobić za pomocą CAST
Drahcir
@TomMedley: Tak, nie zrobiłbym tego, gdybym używał również PHP, ale to tylko dla niektórych wyzwalaczy i funkcji
Drahcir
2
@TomMedley Byłbym bardziej zniuansowany: formatowanie w zapytaniu SQL jest przydatne podczas tworzenia widoków.
VH-NZZ
1
Spowoduje to dodanie przecinków jako separatorów tysięcy do liczby.
Jan Špaček
22

Bardziej zoptymalizowany sposób w tym celu *:

SELECT columnName DIV 1 AS columnName, moreColumns, etc
FROM myTable
WHERE ...

Użycie DIV 1 to ogromna poprawa szybkości w stosunku do FLOOR , nie wspominając o funkcjach opartych na ciągach znaków, takich jak FORMAT

mysql> SELECT BENCHMARK(10000000,1234567 DIV 7) ;
+-----------------------------------+
| BENCHMARK(10000000,1234567 DIV 7) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.83 sec)

mysql> SELECT BENCHMARK(10000000,1234567 / 7) ;
+---------------------------------+
| BENCHMARK(10000000,1234567 / 7) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (7.26 sec)

mysql> SELECT BENCHMARK(10000000,FLOOR(1234567 / 7)) ;
+----------------------------------------+
| BENCHMARK(10000000,FLOOR(1234567 / 7)) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (8.80 sec)

(*) UWAGA: Jak wskazał Grbts, należy pamiętać o zachowaniu DIV 1, gdy jest używany z wartościami bez znaku / dodatnimi.

David Strencsev
źródło
21

Z artykułu, do którego utworzyłeś link:

Typ może mieć jedną z następujących wartości:

BINARY [(N)]

CHAR [(N)]

DATA

DATETIME

DECIMAL [(M [, D])]

PODPISANO [INTEGER]

CZAS

UNSIGNED [INTEGER]

Spróbuj SIGNEDzamiastINT

fredley
źródło
Dzięki, ale teraz pojawia się inny błąd: Kod błędu 1292, stan SQL 22001: Obcięcie danych: Obcięta niepoprawna wartość INTEGER: „558,00”
Drahcir
13

Użyj tego

mysql> SELECT TRUNCATE(223.69, 0);
        > 223

Oto link

panda
źródło
10

Istnieje ważna różnica między floor () a DIV 1. W przypadku liczb ujemnych zachowują się inaczej. DIV 1 zwraca część całkowitą (rzutowaną tak, jak robi to ze znakiem), podczas gdy floor (x) zwraca „największą wartość całkowitą nie większą niż x” (z instrukcji). A więc: select floor (-1.1) daje -2, a select -1,1 div 1 daje -1

Grbts
źródło
10

Funkcja CAST () nie obsługuje „oficjalnego” typu danych „INT” w MySQL, nie ma go na liście obsługiwanych typów . W MySQL można zamiast tego użyć „PODPISANY” (lub „NIEPODPISANY”):

CAST(columnName AS SIGNED)

Jednak wydaje się, że jest to specyficzne dla MySQL (nie znormalizowane), więc może nie działać z innymi bazami danych. Przynajmniej ten dokument (Drugi projekt nieformalnego przeglądu) ISO / IEC 9075: 1992, baza danych nie wymienia „PODPISANY” / „NIEPODPISANY” w sekcji 4.4 Numbers.

Ale DECIMAL jest zarówno ustandaryzowany, jak i obsługiwany przez MySQL, więc poniższe powinny działać dla MySQL (przetestowane) i innych baz danych:

CAST(columnName AS DECIMAL(0))

Według dokumentacji MySQL :

Jeśli skala wynosi 0, wartości DECIMAL nie zawierają przecinka ani części ułamkowej.

podstawowy6
źródło
3

Istnieje również ROUND (), jeśli twoje liczby niekoniecznie zawsze kończą się na .00. RUND (20.6) da 21, a ROUND (20.4) da 20.

Jamie Brown
źródło
3

możesz spróbować tego:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 
mshabab
źródło
1

Próbować cast (columnName as unsigned)

unsigned jest tylko wartością dodatnią

Jeśli chcesz zawierać wartość ujemną, a następnie cast (columnName as signed),
Różnica pomiędzy znak ujemny (to) oraz unsigned (dwukrotnej wielkości znaku, ale nieujemna)

ajreal
źródło
1

1 cent: bez spacji b / w CAST i (wyrażenie). tj. CAST (columnName AS SIGNED).

bbe
źródło