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_nameduration_dayscomplete_weeks
Project A152
Project B456
Project C71

計算折扣後的整數價格

假設折扣後的價格需要取整數(去除小數部分):

SELECT
    product_name,
    original_price,
    discount_rate,
    FLOOR(original_price * (1 - discount_rate)) AS discounted_price
FROM
    products;
product_nameoriginal_pricediscount_ratediscounted_price
Laptop1299.990.151104
Mouse49.990.1044

分時段統計

將時間戳轉換為小時區間進行統計:

-- 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.323
2.022
-2.3-3-2
-2.0-2-2

注意事項

  • FLOOR(NULL) 的結果是 NULL
  • 對於負數,FLOOR() 返回的是「較小」的整數,這與某些直覺可能不同。
  • 如果需要單純截斷小數部分而不考慮正負方向,應使用 TRUNCATE() 函數(如果資料庫支援)。