Skip to content

Instantly share code, notes, and snippets.

@jame2408
Last active September 26, 2022 06:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jame2408/acbdef5b50ac465fb5cba8d8759495f2 to your computer and use it in GitHub Desktop.
Save jame2408/acbdef5b50ac465fb5cba8d8759495f2 to your computer and use it in GitHub Desktop.
DATEADD 與 DATEDIFF 日期應用
/*
DATEADD與DATEDIFF的應用:
1. DATEDIFF:起始日與迄日之間差異了幾天(Day)/月(MONTH)/季(QUARTER)/年(YEAR)
- 常見用法:DATEDIFF(Day/Week/MONTH/QUARTER/YEAR, 起日, 迄日)
- 起日/迄日:
- 日期部份若放為『0』或『''』,代表資料庫最小時間1900-01-01 00:00:00.000。
- 同理,若為『-1』,代表1899-12-31 00:00:00.000。
2. DATEADD:增加/減少天數(Day)/月(MONTH)/季(QUARTER)/年(YEAR),範例如下:
- 加一個月 DATEADD(MONTH, 1 ,GETDATE())
- 減一天 DATEADD(DAY, -1 ,GETDATE())
資料來源:
- 我的Coding之路(https://dotblogs.com.tw/lastsecret/2010/10/04/18097)
- ~楓花雪岳~(http://jengting.blogspot.tw/2011/09/sql-dateadddatediff.html)
*/
--當月第一天
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) ,0)
--當月最後一天
SELECT DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()), -1)
--當季第一天(1月1號、4月1號、7月1號、10月1號)
SELECT DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0)
--當季最後一天(3月30號、6月30號、9月30號、12月31號)
SELECT DATEADD(QUARTER, DATEDIFF(QUARTER, -1, GETDATE()), -1)
--當天 00:00:00.000(午夜12點,一天的開始)
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
--將西元年(datetime格式)轉換成民國年(CHAR格式)
select CAST(DATEDIFF(YEAR, '1911-01-01', getdate()) AS VARCHAR(3)) +
REPLACE(CONVERT(CHAR(5), GETDATE(), 1),'/','')
/*
取得特定日期是否為週末假日:
1900-01-01為星期一,用 DATEDIFF 函數算出任意日期與這一天的差異天數,再取得除以 7 的餘數,可以算出以下數據:
| 星期 | 餘數 | 備註 | 整除於5的值 |
| 一 | 0 | 工作天 | 0 |
| 二 | 1 | 工作天 | 0 |
| 三 | 2 | 工作天 | 0 |
| 四 | 3 | 工作天 | 0 |
| 五 | 4 | 工作天 | 0 |
| 六 | 5 | 週末 | 1 |
| 日 | 6 | 週末 | 1 |
從上表可知我們若要透過 T-SQL 語法計算該日期是否為週末假日,就可以用以下語法取得 True/False 型態的結果
資料來源:The Will Will Web(http://blog.miniasp.com/post/2009/01/20/How-to-use-simple-T-SQL-to-get-weekend-status-in-date.aspx)
*/
select DATEDIFF(DAY, 0, '2016-08-28') % 7 / 5 -- 1 (星期日)
select DATEDIFF(DAY, 0, '2016-08-29') % 7 / 5 -- 0 (星期一)
select DATEDIFF(DAY, 0, '2016-08-30') % 7 / 5 -- 0 (星期二)
select DATEDIFF(DAY, 0, '2016-08-31') % 7 / 5 -- 0 (星期三)
select DATEDIFF(DAY, 0, '2016-09-01') % 7 / 5 -- 0 (星期四)
select DATEDIFF(DAY, 0, '2016-09-02') % 7 / 5 -- 0 (星期五)
select DATEDIFF(DAY, 0, '2016-09-03') % 7 / 5 -- 1 (星期六)
select DATEDIFF(DAY, 0, getdate()) % 7 / 5 -- 看執行結果為0或1就知道是否為週末
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment