2011-05-09 95 views
0

我想,以填補在SQL Server表「日曆」在一個vb.net窗體上點擊一個按鈕,我必須填寫下一列:日期,week_weekend(此日期(星期一,星期二,...),period_name(季節,假日),code_schoolholiday(y或N),code_holiday(聖誕節,新年等)存儲過程來填充日曆

+4

爲什麼你需要一個按鈕的點擊,以填補這相對於只產生[若干輔助日曆表(HTTP:// codeinet。 blogspot.com/2006/08/auxiliary-calendar-table-for-sql.html)提前? – 2011-05-09 09:47:17

回答

1

找到一週使用的日期select DATEPART(weekday, _date_goes_here_)這會給你一個表示當天的數字。您可以使用下面的代碼爲今天獲得一天的名字:

-- EDIT as Martin rightly pointed out, you need to take 
-- @@datefirst into account here's a version of code which will 
-- return the right dayname regardless of this variable's value 
select case DATEPART(weekday, getdate() + @@datefirst) 
when 1 then 'Sunday' 
when 2 then 'Monday' 
when 3 then 'Tuesday' 
when 4 then 'Wednesday' 
when 5 then 'Thursday' 
when 6 then 'Friday' 
when 7 then 'Saturday' 
end 

你也可以很容易找到,如果這一天是週末:

select case DATEPART(weekday, getdate()) 
when 1 then 'weekend' 
when 7 then 'weekend' 
else 'weekday' 
end 

更多有關DATEPART功能at MSDN

我們插入有很多日期的很多行和計算的數據,你需要下面的代碼(今天選擇和以下99天的變化,當然,你需要用0把它包聲明):

select v1.x * 10 + v2.x as dayoffset 
,  cast((GETDATE() + v1.x * 10 + v2.x) as DATE) as calendardate 
, case DATEPART(weekday, cast((GETDATE() + v1.x * 10 + v2.x) as DATE)) 
    when 1 then 'Sunday' 
    when 2 then 'Monday' 
    when 3 then 'Tuesday' 
    when 4 then 'Wednesday' 
    when 5 then 'Thursday' 
    when 6 then 'Friday' 
    when 7 then 'Saturday' 
    end as dayname 
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (0)) v1(x) 
cross join (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (0)) v2(x) 
order by v1.x * 10 + v2.x 

你需要縮小你的要求爲其他數據:

  1. 定義季節和標準的名稱,以決定每一天是哪個季節 - 我相信你可以在這裏再次輕鬆使用DATEPART功能。
  2. 學校假期發生在每個國家甚至每個大個國家地區不同天。縮小範圍。同樣在一些國家(如波蘭),有些年份在週末和銀行假期之間增加了額外的免費天數,以便延長假期,並且作爲交換,孩子們在一週後的星期六去上學。
  3. 定義你明白節假日 - 無天?特殊宗教儀式/事件發生的日子?如果是的話那麼哪個宗教,國家,宗教味道呢?我相信再次DATEPART功能將成爲你在這裏的好朋友。

要確定除夕:

select d, case 
    when DATEPART(month, d) = 12 and DATEPART(DAY, d) = 31 then 'New years eve' 
    else 'other day' 
    end 
from (
    select CAST('2010-12-31' as datetime) 
    union 
    select GETDATE() 
) t(d) 
+1

DATEPART(平日...的'結果'不能保證像你一樣。你需要考慮到的'@@ DATEFIRST' – 2011-05-09 11:00:34

+0

@馬丁你是如此吧!謝謝你,我會更新我的答案。 – Jakub 2011-05-09 11:08:29

+0

的'VALUES'位是特定於SQL Server – 2011-05-09 11:33:08