在 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 算出該日期是否為週末假日了,至少比在程式中計算日期格式簡便且快多了。
相關連結