[SQL Sever] 日期時間

SQL Server 中,有這些型態來表示日期:
  • DATE 型態 - 格式是 YYYY-MM-DD
  • DATETIME 型態 - 格式是 YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME 型態 - 格式是 YYYY-MM-DD HH:MI:SS


SQL Server





SQL Server GETDATE() 取得現在的日期時間

在 SQL Server 你可以使用 GETDATE() 函數來取得當前的日期時間。

GETDATE() 語法 (Syntax)

GETDATE()

GETDATE() 用法 (Example)

這個 SQL:
SELECT GETDATE() AS CurrentDateTime
會得到現在的日期時間例如:
2018-11-30 13:10:02.047


SQL Server DATEPART() 取出日期和時間中特定的部分

在 SQL Server 中,我們可以用 DATEPART() 函數來取出日期和時間中特定的部分,比如年、月、日、時、分、秒等。

DATEPART() 語法 (Syntax)

DATEPART(datepart , date)
DATEPART() 會返回一個整數,其中 datepart 參數用來指定要返回的部分,datepart 可以是這些值:



datepart (全名和縮寫)返回值說明
year, yyyy, yy年,例如 2007
month, mm, m月,例如 10
day, dd, d日,例如 30
hour, hh時,例如 12
minute, n分,例如 15
second, ss, s秒,例如 32
millisecond, ms毫秒,例如 123
microsecond, mcs微秒,例如 123456
nanosecond, ns毫微秒,例如 123456700
quarter, qq, q季,例如 4
dayofyear, dy, y一年中的第幾天,例如 303
week, wk, ww一年中的第幾週,例如 45
weekday, dw星期幾,例如 1
TZoffset, tz時區 time zone offset,單位是分鐘,例如 310

DATEPART() 用法 (Example)

假設有一個 Orders table:
OrderIdProductNameOrderDate
1'Bike'2018-10-22 16:25:46.635
這個 SQL:

SELECT DATEPART(yyyy, OrderDate) AS OrderYear,
DATEPART(mm, OrderDate) AS OrderMonth,
DATEPART(dd, OrderDate) AS OrderDay
FROM Orders
會得到例如:


OrderYearOrderMonthOrderDay
20181022

SQL Server DATEADD() 增加或減少指定的時間間隔

在 SQL Server 中,我們可以用 DATEADD() 函數在日期和時間中增加或減少指定的時間間隔。

DATEADD() 語法 (Syntax)

DATEADD(datepart, number, date)
DATEADD() 會將指定的 number 值 (一個正負號的整數) 加到 date 值的指定 datepart,然後返回修改後的值。
其中 datepart 可以是這些值:
datepart (全名和縮寫)說明
year, yyyy, yy
month, mm, m
day, dd, d
hour, hh
minute, n
second, ss, s
millisecond, ms毫秒
microsecond, mcs微秒
nanosecond, ns毫微秒
quarter, qq, q
dayofyear, dy, y一年中的第幾天
week, wk, ww
weekday, dw星期幾

DATEADD() 用法 (Example)

假設有一個 Orders table:
OrderIdProductNameOrderDate
1'Bike'2018-10-22 16:25:46.635
對 OrderDate 往後加兩天:
SELECT OrderId,
DATEADD(day, 2, OrderDate) AS OrderDate2
FROM Orders
會得到例如:
OrderIdOrderDate2
12018-10-24 16:25:46.635

舉另外一個例子,這個 SQL:
DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';

SELECT 'year', DATEADD(year, 1, @datetime2)  
UNION ALL  
SELECT 'quarter', DATEADD(quarter, 1, @datetime2)  
UNION ALL  
SELECT 'month', DATEADD(month, 1, @datetime2)  
UNION ALL  
SELECT 'dayofyear', DATEADD(dayofyear, 1, @datetime2)  
UNION ALL  
SELECT 'day', DATEADD(day, 1, @datetime2)  
UNION ALL  
SELECT 'week', DATEADD(week, 1, @datetime2)  
UNION ALL  
SELECT 'weekday', DATEADD(weekday, 1, @datetime2)  
UNION ALL  
SELECT 'hour', DATEADD(hour, 1, @datetime2)  
UNION ALL  
SELECT 'minute', DATEADD(minute, 1, @datetime2)  
UNION ALL  
SELECT 'second', DATEADD(second, 1, @datetime2)  
UNION ALL  
SELECT 'millisecond', DATEADD(millisecond, 1, @datetime2)  
UNION ALL  
SELECT 'microsecond', DATEADD(microsecond, 1, @datetime2)  
UNION ALL  
SELECT 'nanosecond', DATEADD(nanosecond, 1, @datetime2);  
會得到以下結果:

Year         2008-01-01 13:10:10.1111111  
quarter      2007-04-01 13:10:10.1111111  
month        2007-02-01 13:10:10.1111111  
dayofyear    2007-01-02 13:10:10.1111111  
day          2007-01-02 13:10:10.1111111  
week         2007-01-08 13:10:10.1111111  
weekday      2007-01-02 13:10:10.1111111  
hour         2007-01-01 14:10:10.1111111  
minute       2007-01-01 13:11:10.1111111  
second       2007-01-01 13:10:11.1111111  
millisecond  2007-01-01 13:10:10.1121111  
microsecond  2007-01-01 13:10:10.1111121  
nanosecond   2007-01-01 13:10:10.1111111 

SQL Server DATEDIFF() 日期相減

在 SQL Server 中,我們可以用 DATEDIFF() 函數取得兩個日期之間相差的時間間隔。

DATEDIFF() 語法 (Syntax)

DATEDIFF(datepart, startdate, enddate)
DATEDIFF() 執行後會返回一個正負樹的整數,表示 enddate - startdate 的時間間隔,datepart 參數則用來指定返回值的單位。
datepart 可以是:
datepart (全名和縮寫)說明
year, yyyy, yy
month, mm, m
day, dd, d
hour, hh
minute, n
second, ss, s
millisecond, ms毫秒
microsecond, mcs微秒
nanosecond, ns毫微秒
quarter, qq, q
dayofyear, dy, y一年中的第幾天
week, wk, ww

DATEDIFF() 用法 (Example)

取得兩個日期之間差幾天:
SELECT DATEDIFF(day, '2008-06-10', '2008-08-10') AS DiffDate
結果:
DiffDate
61
如果將日期前後相反過來,會得到負數:
SELECT DATEDIFF(day, '2008-08-10', '2008-06-10') AS DiffDate
結果:
DiffDate
-61

取得兩個日期之間差幾秒:
SELECT DATEDIFF(second, '2005-07-20', '2005-7-25 22:56:32') AS DiffDate
DiffDate
514592

取得一年中的第一天:
SELECT DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)
這個 SQL 的技巧是先取得和 1900-01-01 - 也就是上面的 0 的意思,SQL Server 中的第零天 - 差幾年 (從 DATEDIFF 得到一個整數),再用 DATEADD 加 0 來將整數再轉成日期的型態。
取得一季中的第一天:
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0)
取得一個月中的第一天:
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
取得一周中的第一天:
SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)
取得一個月中的最後一天:
SELECT DATEADD(millisecond, -3, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0))

-3 是因為 SQL Server datetime 的精度 (precision) 是到 3 毫秒。

SQL Server CONVERT() 格式化顯示日期和時間 (convert dateime)

在 SQL Server 中,可以用 CONVERT() 函數來用不同的格式顯示日期和時間。

CONVERT() 語法 (Syntax)

CONVERT(data_type, date, style)  
CONVERT() 執行後會返回 date 格式化後的結果。
其中參數 data_type 可以指定輸出的資料型態,例如 varchar;也可以指定長度,例如 varchar(10)。
而參數 style 是用來指定日期和時間的輸出格式,可以是下列這些值:
style id
不含世紀 (yy)
style id
含世紀 (yyyy)
說明顯示格式
  • | 0
    100 | datetime 和 smalldatetime 的預設值 | mon dd yyyy hh:miAM (或 PM) 1 | 101 | 美式英文 | 1 = mm/dd/yy
    101 = mm/dd/yyyy 2 | 102 | ANSI | 2 = yy.mm.dd
    102 = yyyy.mm.dd 3 | 103 | 英式英文/法文 | 3 = dd/mm/yy
    103 = dd/mm/yyyy 4 | 104 | 德文 | 4 = dd.mm.yy
    104 = dd.mm.yyyy 5 | 105 | 義大利文 | 5 = dd-mm-yy
    105 = dd-mm-yyyy 6 | 106 | - | 6 = dd mon yy
    106 = dd mon yyyy 7 | 107 | - | 7 = Mon dd, yy
    107 = Mon dd, yyyy 8 | 108 | - | hh:mi:ss
  • | 9
    109 | 預設值 + 毫秒 | mon dd yyyy hh:mi:ss:mmmAM (或 PM) 10 | 110 | USA | 10 = mm-dd-yy
    110 = mm-dd-yyyy 11 | 111 | 日本 | 11 = yy/mm/dd
    111 = yyyy/mm/dd 12 | 112 | ISO | 12 = yymmdd
    112 = yyyymmdd
  • | 13
    113 | 歐洲預設值 + 毫秒 | dd mon yyyy hh:mi:ss:mmm(24h) 14 | 114 | - | hh:mi:ss:mmm(24h)
  • | 20
    120 | ODBC 標準 | yyyy-mm-dd hh:mi:ss(24h)
  • | 21
    121 | time、date、datetime2 和 datetimeoffset 的 ODBC 標準 (使用毫秒) 預設值 | yyyy-mm-dd hh:mi:ss.mmm(24h)
  • | 126 | ISO8601 | yyyy-mm-ddThh:mi:ss.mmm (無空格)

    注意:針對毫秒 (mmm) 值 0,不會顯示毫秒十進位小數值。 例如,'2012-11-07T18:26:20.000' 值會顯示為 '2012-11-07T18:26:20'。
  • | 127 | 具有時區 Z 的 ISO8601 | yyyy-mm-ddThh:mi:ss.mmmZ (無空格)

    注意:針對毫秒 (mmm) 值 0,不會顯示毫秒十進位值。 例如,'2012-11-07T18:26:20.000' 值會顯示為 '2012-11-07T18:26:20'。
  • | 130 | 回曆 | dd mon yyyy hh:mi:ss:mmmAM

    在此樣式中,mon 代表完整月份名稱的多 Token 回曆 Unicode 表示法。 這個值無法在 SSMS 的預設美國安裝中正確呈現。
  • | 131 | 回曆 | dd/mm/yyyy hh:mi:ss:mmmAM

CONVERT() 用法 (Example)

SELECT CONVERT(varchar, GETDATE(), 10) AS Converted
得到結果:
Converted
12-20-18

SELECT CONVERT(varchar, GETDATE(), 100) AS Converted
得到結果:
Converted
Dec 20 2018 1:18PM




留言

這個網誌中的熱門文章

[HTML]標籤-下

論P, NP, NP-Complete, NP-Hard問題

[Python]基礎課程

[系統]解除電腦限制頻寬

[HTML]標籤-上

[AlaSQL] 多data查詢+累計

How to Check the MySQL Version

推薦使用的9款編程字體

類別型態 vs 基本型態