﻿# 分享一些與日期相關的 SQL 語法技巧

日期格式很常用，但有些特殊的需求要計算出來還蠻麻煩了，底下這些是我之前記錄下來的一些小技巧，真的要寫的時候若一些 SQL 函數不熟還真不容易寫出來呢！

**顯示當下日期時間**

```
select getdate()
```

**顯示本月第一天的語法（不含時間的部分）**

```
select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
```

**顯示上個月最後一天（不含時間的部分）**

```
select DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0))
```

**顯示這個月最後一天（不含時間的部分）**

```
select DATEADD(mm,  1, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)))
```

**將「日期字串」轉成「日期格式 」**

```
SELECT CONVERT(datetime, '20080401 11:35:00.000')
```

P.S. 其實不是 100% 會轉成功，不過大部分人看的懂得日期時間格式應該都會自動轉換成功。

**將「日期格式」轉成「日期字串」（可自訂輸出格式）**

請參考此文章：[用 SQL Server 中的 CONVERT 函數處理日期字串](/post/2008/02/26/Use-CONVERT-function-to-deal-with-SQL-Server-Datetime)

**取得目前月份的數值，若小於 10 則補 0 ( 回傳字串格式 ) ( 例如: 2008-04-11 會回傳  04 )**

```
SELECT REPLACE(STR(datepart(mm, getdate()), 2, 0), ' ', '0')
```

P.S. 若用 datepart(mm, getdate()) 的話只會回傳 4 而已，並不會補零 ( 因為是 int 型別 )

**相關連結**

-   [DATEDIFF](http://msdn2.microsoft.com/zh-tw/library/ms189794.aspx) (Transact-SQL)  
    
-   [DATEPART](http://msdn2.microsoft.com/zh-tw/library/ms174420.aspx) (Transact-SQL)  
    
-   [CAST 和 CONVERT](http://msdn2.microsoft.com/zh-tw/library/ms187928.aspx) (Transact-SQL)  
    
-   [STR](http://msdn2.microsoft.com/zh-tw/library/ms189527.aspx) (Transact-SQL)  
    
-   [REPLACE](http://msdn2.microsoft.com/zh-tw/library/ms186862.aspx) (Transact-SQL)
