FLOOR() 函數 (SQL FLOOR() Function)
FLOOR() 函數用於將數值無條件捨去,返回小於或等於指定數值的最大整數。這也稱為「向下取整」或「地板函數」。
這個函數在所有主流資料庫系統中(MySQL、SQL Server、PostgreSQL、Oracle)的語法和行為都是一致的。
FLOOR() 語法 (Syntax)
FLOOR(number)
- number:要進行無條件捨去的數值。
FLOOR() 函數用法範例 (Example)
基本範例
SELECT FLOOR(10.9); -- 結果:10
SELECT FLOOR(10.1); -- 結果:10
SELECT FLOOR(10.0); -- 結果:10(已是整數,不變)
SELECT FLOOR(-10.1); -- 結果:-11(向負無窮方向捨去)
SELECT FLOOR(-10.9); -- 結果:-11
對於負數,FLOOR() 會返回更接近負無窮大的整數(即「較小」的整數)。這與許多程式語言中的行為一致。
計算完整週數
假設要計算一個專案持續了多少完整週:
SELECT
project_name,
duration_days,
FLOOR(duration_days / 7) AS complete_weeks
FROM
projects;
| project_name | duration_days | complete_weeks |
|---|---|---|
| Project A | 15 | 2 |
| Project B | 45 | 6 |
| Project C | 7 | 1 |
計算折扣後的整數價格
假設折扣後的價格需要取整數(去除小數部分):
SELECT
product_name,
original_price,
discount_rate,
FLOOR(original_price * (1 - discount_rate)) AS discounted_price
FROM
products;
| product_name | original_price | discount_rate | discounted_price |
|---|---|---|---|
| Laptop | 1299.99 | 0.15 | 1104 |
| Mouse | 49.99 | 0.10 | 44 |
分時段統計
將時間戳轉換為小時區間進行統計:
-- MySQL
SELECT
FLOOR(HOUR(created_at) / 4) AS time_slot, -- 每 4 小時為一個時段
COUNT(*) AS order_count
FROM
orders
GROUP BY
FLOOR(HOUR(created_at) / 4)
ORDER BY
time_slot;
FLOOR() 與 TRUNCATE() 的差異
FLOOR() 和 TRUNCATE() 對於正數的處理結果相同,但對於負數的處理方式不同:
| 函數 | 正數範例 | 負數範例 |
|---|---|---|
| FLOOR(3.7) | 3 | - |
| FLOOR(-3.7) | - | -4(向負無窮) |
| TRUNCATE(3.7,0) | 3 | - |
| TRUNCATE(-3.7,0) | - | -3(向零截斷) |
SELECT FLOOR(-3.7); -- 結果:-4
SELECT TRUNCATE(-3.7, 0); -- 結果:-3(MySQL)
FLOOR() 與 CEIL() 的對比
| 輸入值 | FLOOR() | CEIL() |
|---|---|---|
| 2.3 | 2 | 3 |
| 2.0 | 2 | 2 |
| -2.3 | -3 | -2 |
| -2.0 | -2 | -2 |
注意事項
FLOOR(NULL)的結果是NULL。- 對於負數,
FLOOR()返回的是「較小」的整數,這與某些直覺可能不同。 - 如果需要單純截斷小數部分而不考慮正負方向,應使用
TRUNCATE()函數(如果資料庫支援)。