劳动节与感恩 [英] Labor Day Vs. Thanksgiving

查看:71
本文介绍了劳动节与感恩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为仓库创建日历表。我将使用它作为所有日期字段的外键。



下面显示的代码创建并填充表格。我能够弄清楚如何找到阵亡将士纪念日(5月的最后一个星期一)和劳动节(9月的第一个星期一)。

 

DROP表上设置编号日历
GO
创建表dbo.Calendar

CalendarId整数NOT NULL,
DateValue日期NOT NULL,
DayNumberOfWeek整数NOT NULL,
NameOfDay VarChar(10)NOT NULL,
NameOfMonth VarChar(10)非空,
WeekOfYear整数非空,
JulianDay整数非空,
USAIsBankHoliday Bit非空,
USADayName VarChar(100)空,

ALTER TABLE dbo.Calendar添加约束
DF_Calendar_USAIsBankHoliday默认为0 USAAssBankHoliday
GO
ALTER TABLE dbo.Calendar添加约束
DF_Calendar_USADayName DEFA b $ b GO

声明@StartDate DateTime = '01 / 01/2000'
声明@EndDate DateTime = '01 / 01/2020'

而@开始日期< @EndDate
开始
插入dbo.Calendar

CalendarId,
DateValue,
WeekOfYear,
DayNumberOfWeek,
NameOfDay ,
NameOfMonth,
JulianDay



YEAR(@StartDate)* 10000 + MONTH(@StartDate)* 100 + Day(@ StartDate),--CalendarId
@StartDate,-DateValue
DATEPART(ww,@StartDate),-WeekOfYear
DATEPART(dw,@StartDate),-DayNumberOfWeek
DATENAME(dw,@StartDate),-NameOfDay
DATENAME(M,@StartDate),-NameOfMonth
DATEPART(dy,@StartDate)-JulianDay


设置@StartDate + = 1
结束

-======================== =周末
-星期六和星期日
更新dbo.Calendar SET USAIsBankHoliday = 1,USADayName + ='Weekend,'WHERE DayNumberOfWeek IN(1、7)


-====================== =====银行假期
-元旦
更新dbo.Calendar SET USAIsBankHoliday = 1,USADayName + ='New Year's Day,'WHERE(CalendarId%2000)IN(101 )

-阵亡将士纪念日(5月的最后一个星期一)
更新dbo.Calendar
SET USAIsBankHoliday = 1,
USADayName + ='Memorial Day,'
WHERE 1 = 1
和CalendarId in

SELECT MAX(CalendarId)
from dbo.Calendar
WHERE MONTH(DateValue)= 5
AND DATEPART(DW,DateValue)= 2
按年份分组(datevalue)


-独立日
更新dbo.Calendar SET USAIsBankHoliday = 1,USADayName + ='独立日,'(日历(%2000)在(704)

-劳动节(9月的第一个星期一)
更新dbo。日历
SET USAIsBankHoliday = 1,
USADayName + ='劳动节,'
其中1 = 1
和CalendarId在
中(
从dbo中选择MIN(CalendarId)
。日历
WHERE MONTH(DateValue)= 9
和DATEPART(DW,DateValue)= 2
按年份分组(datevalue)


-感恩节(第四周四)十一月)
UPDATE dbo.Calendar
SET USAIsBankHoliday = 1,
USADayName + ='感恩节,'
WHERE 1 = 1
AND CalendarId IN

从dbo中选择Max(CalendarId)
.Calendar
WHERE MONTH(DateValue)= 11
AND DATEPART(DW,DateValue)= 5
按年份分组(日期值)


-圣诞节
更新dbo.Calendar SET USAIsBankHoliday = 1,USADayName + ='Christmas Day,'(WHERE(CalendarId%2000)IN(1225)

-==========================其他命名的日子
-除夕
更新dbo.Calendar SET USADayName + ='New Year's Eve,'WHERE(CalendarId%2000)IN(1231)

-圣诞平安夜
更新dbo.Calendar SET USADayName + ='Christmas Eve,'WHERE(CalendarId%2000)IN(1224)

-节礼日
更新dbo.Calendar SET USADayName + ='节礼日,'WHERE(CalendarId%2000)IN(1226)

-======= ====================删除尾随逗号
UPDATE dbo.Calendar SET USADayName = SubString(USADayName,1,LEN(USADayName)-1)WHERE LEN( USADayName)> 2

SELECT * FROM dbo.Calendar

我很困惑感恩节(11月最后一个完整周的星期四)。



编辑:
根据 John的评论进行更正绍尔



感恩节是11月的第四个星期四。但是,经过数年的考察,我发现它也是11月最后一个完整周的星期四。

解决方案

< blockquote>

我对感恩节(11月的最后一个完整周的星期四)感到困惑。


11月的最后一个星期六-2


I am creating a calendar table for my warehouse. I will use this as a foreign key for all the date fields.

The code shown below creates the table and populates it. I was able to figure out how to find Memorial Day (last Monday of May) and Labor Day (first Monday of September).

SET NOCOUNT ON

DROP Table dbo.Calendar
GO
Create Table dbo.Calendar
(
    CalendarId              Integer NOT NULL,
    DateValue               Date    NOT NULL,
    DayNumberOfWeek         Integer NOT NULL,
    NameOfDay               VarChar (10) NOT NULL,
    NameOfMonth             VarChar (10) NOT NULL,
    WeekOfYear              Integer NOT NULL,
    JulianDay               Integer NOT NULL,
    USAIsBankHoliday        Bit     NOT NULL,
    USADayName              VarChar (100) NULL,
)
ALTER TABLE dbo.Calendar ADD CONSTRAINT
    DF_Calendar_USAIsBankHoliday DEFAULT 0 FOR USAIsBankHoliday
GO
ALTER TABLE dbo.Calendar ADD CONSTRAINT
    DF_Calendar_USADayName DEFAULT '' FOR USADayName
GO

Declare @StartDate  DateTime = '01/01/2000'
Declare @EndDate    DateTime = '01/01/2020'

While @StartDate < @EndDate
Begin
    INSERT INTO dbo.Calendar 
    (
        CalendarId, 
        DateValue, 
        WeekOfYear,
        DayNumberOfWeek,
        NameOfDay,
        NameOfMonth,
        JulianDay
    )
    Values 
    (
        YEAR (@StartDate) * 10000 + MONTH (@StartDate) * 100 + Day (@StartDate), --CalendarId
        @StartDate,                 -- DateValue
        DATEPART (ww, @StartDate),  -- WeekOfYear
        DATEPART (dw, @StartDate),  -- DayNumberOfWeek
        DATENAME (dw, @StartDate),  -- NameOfDay
        DATENAME (M, @StartDate),   -- NameOfMonth
        DATEPART (dy, @StartDate)   -- JulianDay
    )

    Set @StartDate += 1
End

--=========================== Weekends
-- saturday and sunday
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Weekend, ' WHERE DayNumberOfWeek IN (1, 7) 


--=========================== Bank Holidays
-- new years day
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'New Year''s Day, '  WHERE (CalendarId % 2000) IN (101)

-- memorial day (last Monday in May)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Memorial Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT MAX (CalendarId)
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 5 
        AND DATEPART (DW, DateValue)=2
        GROUP BY YEAR (datevalue)
    )

-- independence day
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Independence Day, '  WHERE (CalendarId % 2000) IN (704)

-- labor day (first Monday in September)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Labor Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT MIN (CalendarId)
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 9
        AND DATEPART (DW, DateValue)=2
        GROUP BY YEAR (datevalue)
    )

-- thanksgiving day (fourth Thursday in November)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Thanksgiving Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT Max (CalendarId)
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 11
        AND DATEPART (DW, DateValue)=5
        GROUP BY YEAR (datevalue)
    )

-- christmas
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Christmas Day, '  WHERE (CalendarId % 2000) IN (1225)

--=========================== Other named days
-- new years eve
UPDATE dbo.Calendar SET USADayName += 'New Year''s Eve, '  WHERE (CalendarId % 2000) IN (1231)

-- christmas eve
UPDATE dbo.Calendar SET USADayName += 'Christmas Eve, '  WHERE (CalendarId % 2000) IN (1224)

-- boxing day
UPDATE dbo.Calendar SET USADayName += 'Boxing Day, '  WHERE (CalendarId % 2000) IN (1226)

--=========================== Remove trailing comma
UPDATE dbo.Calendar SET USADayName = SubString (USADayName, 1, LEN (USADayName) -1) WHERE LEN (USADayName) > 2

SELECT * FROM dbo.Calendar

I am stumped on figuring out Thanksgiving day (Thursday of the last FULL week of November).

Edit: Correction based on comment by John Sauer

Thanksgiving is the fourth Thursday of November. However, upon checking several years, I find that it has turned out to also be the Thursday of the last full week of Nov.

解决方案

I am stumped on figuring out Thanksgiving day (Thursday of the last FULL week of November).

Last Saturday of November - 2

这篇关于劳动节与感恩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆