СПРАВИТИ ДЕКІМАЛЬНИЙ до INT


81

Я намагаюся зробити це:

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

Я подивився на поширені запитання про допомогу тут: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html , там написано, що я можу робити це як CAST(val AS TYPE), але це не працює.

Намагаючись перетворити десятковий знак у int, реальне значення - 223,00, а я хочу 223


Попередження про кастинг полягає в тому, що ви постачаєте рядок, чи можете ви це підтвердити?
ajreal

Це працює навіть з
Марією

Відповіді:


127

Ви можете спробувати функцію FLOOR так:

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

Ви також можете спробувати функцію FORMAT , якщо ви знаєте, що десяткові коми можна пропустити:

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

Ви можете поєднати дві функції

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

2
Ви розумієте, що вам не слід мати справу з форматуванням у вашому коді SQL, чи не так?
Фредлі

Гарна робота, +1. Формат добре працює для моєї ситуації, але мені все ще цікаво, чи може хтось це зробити за допомогою CAST
Drahcir

@TomMedley: Так, я б не використовував PHP, але це лише для деяких тригерів та функцій
Drahcir

2
@TomMedley Я б був більш тонкий: форматування в запиті SQL стане в нагоді під час створення подань.
VH-NZZ

1
Це додає до числа коми як тисячі роздільників.
Ян Шпачек

22

Більш оптимізований спосіб Для цієї мети*:

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

Використання DIV 1 - це значне покращення швидкості порівняно з FLOOR , не кажучи вже про функції на основі рядків, такі як 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)

(*) ПРИМІТКА: Як зазначив Grbts, пам’ятайте про поведінку DIV 1, коли використовується з непідписаними / позитивними значеннями.


21

Зі статті, на яку ви посилаєтесь:

Тип може бути одним із таких значень:

Двійковий файл [(N)]

CHAR [(N)]

ДАТА

ДАТА, ЧАС

ДЕСЯТИЧНИЙ [(M [, D])]

ПІДПИСАНО [ЦІЛИЙ]

ЧАС

ПІДПИСАНО [ЦІЛИЙ]

Спробуйте SIGNEDзамістьINT


Дякую, але зараз я отримую ще одну помилку: Код помилки 1292, стан SQL 22001: Усічення даних: усічено неправильне значення INTEGER: '558,00'
Drahcir


10

Існує важлива різниця між floor () та DIV 1. Для від’ємних чисел вони поводяться по-різному. DIV 1 повертає цілу частину (як це робиться за підписом), тоді як floor (x) повертає "найбільше ціле значення, що не перевищує x" (з посібника). Отже: вибір підлоги (-1,1) призводить до -2, тоді як вибір -1,1 div 1 - до -1


10

Функція CAST () не підтримує "офіційний" тип даних "INT" в MySQL, її немає в списку підтримуваних типів . Замість MySQL замість цього можна використовувати "SIGNED" (або "UNSIGNED"):

CAST(columnName AS SIGNED)

Однак, здається, це специфічно для MySQL (не стандартизовано), тому може не працювати з іншими базами даних. Принаймні в цьому документі (Другий неформальний проект огляду) ISO / IEC 9075: 1992, База даних не містить переліку "ПІДПИСАНО" / "НЕПОДПИСАНО" у розділі 4.4 Numbers.

Але DECIMAL стандартизований і підтримується MySQL, тому для MySQL (перевіреного) та інших баз даних має працювати наступне:

CAST(columnName AS DECIMAL(0))

Згідно з документами MySQL :

Якщо шкала дорівнює 0, ДІСЯЧНІ значення не містять десяткової коми або дробової частини.


3

Існує також ROUND (), якщо ваші номери не завжди закінчуються на .00. КРУГ (20.6) дасть 21, а КРУГ (20.4) дасть 20.


3

ви можете спробувати це:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 

1

Спробуйте cast (columnName as unsigned)

unsigned - це лише позитивне значення

Якщо ви хочете включити від'ємне значення, то cast (columnName as signed),
Різниця між знаком (негативний включають) і без знака ( в два рази більше знака, але невід'ємні)


1

1 цент: немає пробілу ч / б CAST і (вираз). тобто CAST (Ім'я стовпчика ЯК ПІДПИСАНО).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.