首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 時間比較與日期處理完整指南

     編輯:關於SqlServer

SQL Server 時間比較核心函數:DATEDIFF 詳解

在 SQL Server 中進行時間比較,最常用的函數是 DATEDIFF。它的語法為 DATEDIFF(datepart, startdate, enddate),回傳兩個日期之間指定單位的差異數值。重點在於參數順序:startdate 為被減數,enddate 為減數,即 enddate - startdate。若結果為正數,代表 enddate 較晚;負數則代表 startdate 較晚。

常見日期單位與範例

  • 年:DATEDIFF(year, '2004-01-01', '2010-01-01') → 6
  • 月:DATEDIFF(month, '2010-01-15', '2010-06-20') → 5(僅比較月份部分)
  • 日:DATEDIFF(day, '2010-07-23 00:41:18', '2010-07-23 23:41:18') → 0(同一天)
  • 時:DATEDIFF(hour, '2010-07-23 00:41:18', '2010-07-23 23:41:18') → 23
  • 秒:DATEDIFF(second, '2004-09-18 00:00:18', '2004-09-18 00:00:19') → 1

取得目前日期時間:GETDATE()

GETDATE() 回傳目前系統日期時間,精確度達 3.33 毫秒。常用於資料表欄位的預設值:

CREATE TABLE site_log (
    username VARCHAR(40),
    useractivity VARCHAR(100),
    entrydate DATETIME DEFAULT GETDATE()
);

日期時間格式轉換:CONVERT()

使用 CONVERT(VARCHAR(30), GETDATE(), style) 可依 style 參數輸出不同格式。常用 style 值:

Style標準輸出範例
0DefaultMon DD YYYY HH:MIAM
1USAMM/DD/YY
3British/FrenchDD/MM/YY
8-HH:MI:SS
9Default + millisecondsNov 30 1997 3:29:55:170AM
11JAPANYY/MM/DD
12ISOYYMMDD
20ODBC canonicalYYYY-MM-DD HH:MI:SS
23ISO8601YYYY-MM-DD
111JAPAN + centuryYYYY/MM/DD
120ODBC canonical + centuryYYYY-MM-DD HH:MI:SS

若需顯示世紀(四位數年份),可將 style 值加 100(如 111 = 11 + 100)。

擷取日期部分:DATEPART() 與 DATENAME()

DATEPART(datepart, date) 回傳整數,DATENAME(datepart, date) 回傳字串。常用 datepart 縮寫:

  • 年:yy、季:qq、月:mm、日:dd
  • 時:hh、分:mi、秒:ss、毫秒:ms
  • 星期:dw(1=星期日)、年內第幾天:dy、年內第幾週:wk

範例:SELECT DATENAME(dw, GETDATE()) + '-' + DATENAME(mm, GETDATE()) → Friday-July

日期範圍查詢:避開常見陷阱

直接比對 WHERE entrydate = '2000-12-25' 只會抓到當天 00:00:00 的資料。正確做法:

  • 範圍比對:WHERE entrydate >= '2000-12-25' AND entrydate < '2000-12-26'
  • LIKE 比對:WHERE entrydate LIKE 'Dec 25 2000%'(需先用 CONVERT 轉為字串格式)

日期加減運算:DATEADD()

DATEADD(datepart, number, date) 可對日期進行加減。例如查詢一個月後的到期日:

SELECT username, DATEADD(month, 1, firstvisit_date) AS 'Registration Expires'
FROM registration_table;

注意:DATEADD(month, 1, ...) 只是將月份值 +1,不會自動加 30 天。

實戰範例:Northwind 資料庫 Employees 表

1. BETWEEN ... AND 範圍查詢

SELECT hiredate
FROM employees
WHERE hiredate BETWEEN CAST('1993-10-17' AS DATETIME) AND CAST('1994-01-02' AS DATETIME);

2. 日期比較:運算子與 DATEDIFF

-- 找出 1993-05-03 之後入職的員工
SELECT hiredate
FROM employees
WHERE DATEDIFF(day, CAST('1993-05-03' AS DATETIME), hiredate) > 0;

邏輯:DATEDIFF(day, start, hiredate) > 0 代表 hiredate 較晚於 start。

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