首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server CONVERT 函數實現日期維度查詢:去除時間成分

     編輯:MySQL 資料庫相關知識

場景痛點

表 Meeting 有 PublishTime DATETIME 列(格式 yyyy-mm-dd hh:mm:ss)。前端傳入參數 @PublishTime = '2004-12-01'(僅日期),直接 WHERE PublishTime = @PublishTime 永遠匹配不到,因為時間成分不為 00:00:00。

解決方案:CONVERT 截取日期部分

-- SQL Server / Sybase 語法
SELECT *
FROM Meeting
WHERE CONVERT(VARCHAR(10), PublishTime, 121) = @PublishTime;

關鍵參數解析

  • VARCHAR(10):目標長度 10,恰好容納 yyyy-mm-dd。
  • 121:ODBC 標準格式 yyyy-mm-dd hh:mi:ss.mmm(含毫秒),截取前 10 字符即日期。
    常用樣式對照:
    Style輸出示例說明
    101mm/dd/yyyy美式
    102yyyy.mm.ddANSI
    103dd/mm/yyyy英式
    120yyyy-mm-dd hh:mi:ssODBC 無毫秒
    121yyyy-mm-dd hh:mi:ss.mmmODBC 有毫秒(推薦)
    126yyyy-mm-ddThh:mi:ss.mmmISO8601

MySQL 對應寫法

-- MySQL 使用 DATE() 函數或 CAST
SELECT * FROM Meeting WHERE DATE(PublishTime) = @PublishTime;
-- 或
SELECT * FROM Meeting WHERE CAST(PublishTime AS DATE) = @PublishTime;
-- 索引友好寫法(避免函數殺索引):
SELECT * FROM Meeting
WHERE PublishTime >= @PublishTime
  AND PublishTime < DATE_ADD(@PublishTime, INTERVAL 1 DAY);

Oracle 對應寫法

-- TRUNC 截取日期
SELECT * FROM Meeting WHERE TRUNC(PublishTime) = TO_DATE(@PublishTime, 'YYYY-MM-DD');
-- 索引友好:
SELECT * FROM Meeting
WHERE PublishTime >= TO_DATE(@PublishTime, 'YYYY-MM-DD')
  AND PublishTime < TO_DATE(@PublishTime, 'YYYY-MM-DD') + 1;

PostgreSQL 對應寫法

SELECT * FROM Meeting WHERE PublishTime::date = @PublishTime::date;
-- 索引友好:
SELECT * FROM Meeting
WHERE PublishTime >= @PublishTime::date
  AND PublishTime < (@PublishTime::date + INTERVAL '1 day');

性能最佳實踐:避免列上用函數

WHERE CONVERT(...)=@param 導致全表掃描,無法利用 PublishTime 索引。推薦範圍查詢:

DECLARE @Date DATE = '2004-12-01';
SELECT * FROM Meeting
WHERE PublishTime >= @Date
  AND PublishTime < DATEADD(DAY, 1, @Date);
  • 可利用索引 SEEK。
  • SARGable(Search ARGument Able),優化器能精確估算行數。
  • 兼容所有主流數據庫(語法微調)。

總結

日期維度查詢的核心是「去除時間成分」。SQL Server 用 CONVERT(VARCHAR(10), col, 121) 簡單直觀,但生產環境務必改寫為範圍查詢以利用索引。MySQL/Oracle/PostgreSQL 均有對應函數(DATE()/TRUNC()/::date),同樣遵循「函數轉換易讀,範圍查詢快」原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved