CAST DECIMAL zu INT

79

Ich versuche das zu tun:

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

Ich habe mir die Hilfe-FAQs hier angesehen: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html . Es heißt, ich kann es so machen CAST(val AS TYPE), aber es funktioniert nicht.

Beim Versuch, eine Dezimalstelle in int umzuwandeln, beträgt der reale Wert 223,00 und ich möchte 223

Drahcir
quelle
Die Warnung vor dem Casting lautet, weil Sie einen String liefern. Können Sie das bestätigen?
Ajreal
Es funktioniert auch mit Maria DB
Niyati

Antworten:

124

Sie können die FLOOR- Funktion folgendermaßen ausprobieren :

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

Sie können auch die FORMAT- Funktion ausprobieren , sofern Sie wissen, dass die Dezimalstellen weggelassen werden können:

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

Sie können die beiden Funktionen kombinieren

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 
RolandoMySQLDBA
quelle
2
Sie erkennen, dass Sie sich nicht mit der Formatierung in Ihrem SQL-Code befassen sollten, oder?
Fredley
Gute Arbeit, +1. Format funktioniert für meine Situation gut, aber ich frage mich immer noch, ob jemand es mit CAST
Drahcir
@ TomMedley: Ja, ich würde nicht, wenn ich auch PHP verwenden würde, aber dies ist nur für einige Trigger und Funktionen
Drahcir
2
@ TomMedley Ich wäre nuancierter: Die Formatierung in der SQL-Abfrage ist praktisch, wenn Sie Ansichten erstellen.
VH-NZZ
1
Dies fügt der Zahl Kommas als Tausendertrennzeichen hinzu.
Jan Špaček
21

Aus dem Artikel, den Sie verlinkt haben:

Der Typ kann einer der folgenden Werte sein:

BINARY [(N)]

CHAR [(N)]

DATUM

TERMINZEIT

DEZIMAL [(M [, D])]

UNTERZEICHNET [INTEGER]

ZEIT

UNSIGNED [INTEGER]

Versuchen Sie SIGNEDstattINT

Fredley
quelle
Vielen Dank, aber ich erhalte jetzt einen weiteren Fehler: Fehlercode 1292, SQL-Status 22001: Datenabschneidung: Falscher INTEGER-Wert abgeschnitten: '558.00'
Drahcir
21

Ein optimierterer Weg hinein für diesen Zweck*:

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

Die Verwendung von DIV 1 ist eine enorme Geschwindigkeitsverbesserung gegenüber FLOOR , ganz zu schweigen von stringbasierten Funktionen wie 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)

(*) HINWEIS: Beachten Sie, wie von Grbts angegeben, das Verhalten von DIV 1 bei Verwendung mit nicht vorzeichenlosen / positiven Werten.

David Strencsev
quelle
13

benutze das

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

Hier ist ein Link

Panda
quelle
10

Es gibt einen wichtigen Unterschied zwischen floor () und DIV 1. Bei negativen Zahlen verhalten sie sich unterschiedlich. DIV 1 gibt den ganzzahligen Teil zurück (wie gegossen wie signiert), während Etage (x) "den größten ganzzahligen Wert nicht größer als x" (aus dem Handbuch) zurückgibt. Also: Wählen Sie Etage (-1,1) , um -2 zu erhalten, während Auswahl von -1,1 Div 1 -1 ergibt

Grbts
quelle
9

Die CAST () -Funktion unterstützt den "offiziellen" Datentyp "INT" in MySQL nicht, sie ist nicht in der Liste der unterstützten Typen enthalten . Mit MySQL könnte stattdessen "SIGNED" (oder "UNSIGNED") verwendet werden:

CAST(columnName AS SIGNED)

Dies scheint jedoch MySQL-spezifisch (nicht standardisiert) zu sein, sodass es möglicherweise nicht mit anderen Datenbanken funktioniert. Zumindest in diesem Dokument (Zweiter informeller Überprüfungsentwurf) ISO / IEC 9075: 1992, Datenbank ist im Abschnitt "SIGNIERT" / "UNSIGNIERT" nicht aufgeführt 4.4 Numbers.

DECIMAL ist jedoch sowohl standardisiert als auch wird von MySQL unterstützt. Daher sollte Folgendes für MySQL (getestet) und andere Datenbanken funktionieren:

CAST(columnName AS DECIMAL(0))

Laut den MySQL-Dokumenten :

Wenn die Skala 0 ist, enthalten DECIMAL-Werte keinen Dezimalpunkt oder Bruchteil.

basic6
quelle
3

Es gibt auch ROUND (), wenn Ihre Zahlen nicht unbedingt immer mit .00 enden. RUNDE (20.6) ergibt 21 und RUNDE (20.4) 20.

Jamie Brown
quelle
3

Sie können dies versuchen:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 
mshabab
quelle
1

Versuchen cast (columnName as unsigned)

vorzeichenlos ist nur ein positiver Wert

Wenn Sie möchten , negativen Wert enthalten, dann cast (columnName as signed),
Der Unterschied zwischen Vorzeichen (negativ ist) und ohne Vorzeichen (doppelt so groß wie der Zeichen, aber nicht-negativ)

ajreal
quelle
1

1 Cent: kein Leerzeichen s / w CAST und (Ausdruck). dh CAST (Spaltenname WIE UNTERZEICHNET).

bbe
quelle