CAST DECIMAL thành INT


81

Tôi đang cố gắng làm điều này:

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

Tôi đã xem các Câu hỏi thường gặp trợ giúp tại đây: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html , nó cho biết tôi có thể làm như thế CAST(val AS TYPE), nhưng nó không hoạt động.

Đang cố gắng chuyển đổi một số thập phân thành int, giá trị thực là 223,00 và tôi muốn 223


Cảnh báo truyền là do bạn đang cung cấp một chuỗi, bạn có thể xác nhận điều đó không?
ajreal

Nó hoạt động ngay cả với maria DB
Niyati

Câu trả lời:


126

Bạn có thể thử chức năng FLOOR như sau:

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

Bạn cũng có thể thử hàm FORMAT , miễn là bạn biết có thể bỏ qua các vị trí thập phân:

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

Bạn có thể kết hợp hai chức năng

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

2
Bạn nhận ra rằng bạn không nên xử lý định dạng trong mã SQL của mình đúng không?
fredley

Làm tốt lắm, +1. Format làm việc cho tốt hoàn cảnh của tôi, nhưng tôi vẫn đang tự hỏi nếu có ai có thể làm điều đó với CAST
Drahcir

@TomMedley: Vâng tôi sẽ không nếu tôi đã sử dụng PHP là tốt, nhưng điều này chỉ dành cho một số nút và chức năng
Drahcir

2
@TomMedley Tôi muốn có nhiều sắc thái hơn: Định dạng trong truy vấn SQL có ích khi tạo các khung nhìn.
VH-NZZ

1
Điều này thêm dấu phẩy làm dấu phân cách hàng nghìn cho số.
Tháng 1 Špaček

22

Một cách tối ưu hóa hơn trong vì mục đích này*:

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

Sử dụng DIV 1 là một cải tiến tốc độ rất lớn so với FLOOR , chưa kể đến các chức năng dựa trên chuỗi như 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)

(*) LƯU Ý: Như đã chỉ ra bởi Grbts, hãy lưu ý hành vi của DIV 1 khi được sử dụng với các giá trị không dấu / dương.


21

Từ bài viết bạn đã liên kết đến:

Loại có thể là một trong các giá trị sau:

BINARY [(N)]

CHAR [(N)]

NGÀY

NGÀY GIỜ

DECIMAL [(M [, D])]

ĐÃ ĐĂNG KÝ [INTEGER]

THỜI GIAN

CHƯA ĐĂNG KÝ [INTEGER]

Hãy thử SIGNEDthay vìINT


Cảm ơn, nhưng tôi nhận được một lỗi ngay bây giờ: Lỗi mã 1292, SQL bang 22001: cắt ngắn dữ liệu: cụt giá trị INTEGER không đúng: '558,00'
Drahcir


10

Có một sự khác biệt quan trọng giữa sàn () và DIV 1. Đối với số âm, chúng hoạt động khác nhau. DIV 1 trả về phần nguyên (như được ép như có dấu), trong khi tầng (x) trả về "giá trị số nguyên lớn nhất không lớn hơn x" (từ hướng dẫn sử dụng). Vì vậy: chọn tầng (-1,1) cho kết quả là -2, trong khi chọn -1,1 div 1 cho kết quả là -1


10

Hàm CAST () không hỗ trợ kiểu dữ liệu "chính thức" "INT" trong MySQL, nó không có trong danh sách các kiểu được hỗ trợ . Với MySQL, "SIGNED" (hoặc "UNSIGNED") có thể được sử dụng thay thế:

CAST(columnName AS SIGNED)

Tuy nhiên, điều này có vẻ là dành riêng cho MySQL (không được chuẩn hóa), vì vậy nó có thể không hoạt động với các cơ sở dữ liệu khác. Ít nhất là tài liệu này (Dự thảo Đánh giá Không chính thức lần thứ hai) ISO / IEC 9075: 1992, Cơ sở dữ liệu không liệt kê "ĐÃ KÝ" / "CHƯA KÝ" trong phần 4.4 Numbers.

Nhưng DECIMAL đều được chuẩn hóa và được hỗ trợ bởi MySQL, vì vậy những điều sau đây sẽ hoạt động cho MySQL (đã được thử nghiệm) và các cơ sở dữ liệu khác:

CAST(columnName AS DECIMAL(0))

Theo tài liệu MySQL :

Nếu tỷ lệ là 0, giá trị DECIMAL không chứa dấu thập phân hoặc phần thập phân.


3

Ngoài ra còn có ROUND () nếu các số của bạn không nhất thiết phải luôn kết thúc bằng .00. ROUND (20.6) sẽ cho 21 và ROUND (20.4) sẽ cho 20.


3

bạn có thể thử cái này:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 

1

Thử cast (columnName as unsigned)

không dấu chỉ là giá trị dương

Nếu bạn muốn bao gồm giá trị âm, thì cast (columnName as signed),
Sự khác biệt giữa dấu (bao gồm phủ định) và không dấu (gấp đôi kích thước của dấu, nhưng không âm)


1

1 xu: không có khoảng trắng b / w CAST và (biểu thức). tức là, CAST (columnName AS SIGNED).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.