如何用簡單的 SQL 技巧取得特定日期是否為週末假日

  分享到噗浪!

在 SQL Server 中有個 DATEDIFF 函數可以計算出兩個日期間的差距,例如若要算出兩個日期的差異「天數」可以用以下語法得知:

SELECT DATEDIFF(day, '2005-12-31', '2009-01-21'); 

而若要查出日期在星期幾,可以用 DATEPART 函數,若是星期日就是 1, 星期一就是 2, 依此類推星期六就是 7。但若我們想得知某一天是否為週末假日的話,好像就沒有現成的函數可用了。

我們可以從日期和時間資料類型與函數 (Transact-SQL)得知 SQL Server 的日期格式有範圍限制,且不同的日期格式範圍還不太一樣:

資料類型 範圍 備註
date 0001-01-01 到 9999-12-31 SQL 2008 新增
smalldatetime 1900-01-01 到 2079-06-06  
datetime 1753-01-01 到 9999-12-31  
datetime2 0001-01-01 00:00:00.0000000 到 9999-12-31 23:59:59.9999999 SQL 2008 新增

巧的是 1900-01-01 與 1753-01-01 這兩天剛好都是星期一,所以如果我們用 DATEDIFF 函數算出任意日期與這一天的差異天數,再取得除以 7 的餘數,可以算出以下數據:

星期 餘數 備註 整除於 5 的值

星期一

0

工作天

0

星期二

1

工作天

0

星期三

2

工作天

0

星期四

3

工作天

0

星期五

4

工作天

0

星期六

5

週末假日

1

星期天

6

週末假日

1

從上表可知我們若要透過 T-SQL 語法計算該日期是否為週末假日,就可以用以下語法取得 True/False 型態的結果:

select DATEDIFF(DAY, '17530101', '2009-01-19') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-20') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-21') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-22') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-23') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-24') % 7 / 5   -- 1
select DATEDIFF(DAY, '17530101', '2009-01-25') % 7 / 5   -- 1

select DATEDIFF(DAY, '17530101', tb.CreationOn) % 7 / 5 FROM tb;

這樣就可以透過 T-SQL 算出該日期是否為週末假日了,至少比在程式中計算日期格式簡便且快多了。

相關連結

此文章由 will 發表於 2009/1/21 上午 12:44:01

永久連結 | 評論 (4) | 此文章的RSSRSS comment feed |

分類: SQL Server

標籤: , , , ,

評論

一月 21. 2009 04:00

kennyshu

Why not just use "Datepart(dw, @dateString)"?
Ex: Select Datepart(dw, '10/18/2008')
    --> 7  (means Saturday)

kennyshu Taiwan

一月 21. 2009 09:03

veronica

Why not just use "Datepart(dw, @dateString)"?
我想是因為這種判斷先算出這是一週的哪一天,還得判斷「6和7都是假日」;
如果但「整除於5等於1是假日」,這樣做完判斷就得到結果了,可以省一個步驟?

veronica Taiwan

一月 21. 2009 09:40

Luzen

what about【select datepart(weekday,'2009-01-18')%6 = 1】means weekend Tong

Luzen Taiwan

一月 21. 2009 15:38

will

Luzen,
你這招是不錯,但也只能算出回應值為 1 的是「假日」而已:
select datepart(weekday,'2009-01-19')%6 -- 2
select datepart(weekday,'2009-01-20')%6 -- 3
select datepart(weekday,'2009-01-21')%6 -- 4
select datepart(weekday,'2009-01-22')%6 -- 5
select datepart(weekday,'2009-01-23')%6 -- 0
select datepart(weekday,'2009-01-24')%6 -- 1
select datepart(weekday,'2009-01-25')%6 -- 1

對於想在程式中單純的判斷「假日」與「非假日」就無法得到 0 與 1 的效果,因為在 SQL Server 中 0 可以直接代表 False,1 可以直接代表 True,我如果要在同一個欄位回應 True/False 你的方法就不行。

再者,我這篇文章是想強調在 SQL Server 中各種「日期格式」的範圍(Range)是不太一樣的。

will Taiwan

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading