2011-05-09 96 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