SQL来确定今天是否是银行假日

SQL来确定今天是否是银行假日,sql,stored-procedures,Sql,Stored Procedures,因此,我有一个网页,要求用户将这些时间表输入到完整的月度数据中,但我试图做的是自动输入时间表,在这个日期有一个公共假日。。。有人能帮忙吗 另外,我有一个表,其中存储了假日,因此我需要匹配今天的日期,如果那天是假日,则框中应显示“HH”sql。这是大型sql存储过程的一部分。。但我相信实施将在这里发生 DECLARE @DaysInMonth INT SELECT @DaysInMonth = DATEPART(dd, DATEADD(dd, -1, DATEADD(mm, 1, CAS

因此,我有一个网页,要求用户将这些时间表输入到完整的月度数据中,但我试图做的是自动输入时间表,在这个日期有一个公共假日。。。有人能帮忙吗

另外,我有一个表,其中存储了假日,因此我需要匹配今天的日期,如果那天是假日,则框中应显示“HH”sql。这是大型sql存储过程的一部分。。但我相信实施将在这里发生

DECLARE @DaysInMonth INT

    SELECT @DaysInMonth = DATEPART(dd, DATEADD(dd, -1, DATEADD(mm, 1, CAST(CAST(@Year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME))))

    DECLARE @Today DATETIME
    DECLARE @LunchStart DATETIME
    DECLARE @LunchEnd DATETIME
    DECLARE @CurrentMonth VARCHAR(16)
    DECLARE @CurrentDay INT
    SELECT @CurrentDay = 1

    SELECT @CurrentMonth = CAST(@Year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-'

    DECLARE @DailyDataId INT

    WHILE @CurrentDay <= @DaysInMonth
    BEGIN
        SELECT @Today = CONVERT(DATETIME, @CurrentMonth + CAST(@CurrentDay AS VARCHAR),  20)

        -- If it's not a working day don't set a lunchbreak
        IF (DATENAME(weekday, @Today) IN (SELECT WorkingDay FROM dbo.udfGetWorkingDays(@TempTimesheetId)))
        BEGIN
            SELECT @LunchStart = @CurrentMonth + CAST(@CurrentDay AS VARCHAR) + ' ' + CAST(DATEPART(hh, @AMOut) AS VARCHAR) + ':' + CAST(DATEPART(mi, @AMOut) AS VARCHAR)
            SELECT @LunchEnd = @CurrentMonth + CAST(@CurrentDay AS VARCHAR) + ' ' + CAST(DATEPART(hh, @PMIn) AS VARCHAR) + ':' + CAST(DATEPART(mi, @PMIn) AS VARCHAR)
        END
        ELSE
        BEGIN
            SELECT @LunchStart = NULL
            SELECT @LunchEnd = NULL
        END
您可以使用EXISTS来检查该天是否为假日,即假日表中存在该天的记录

IF EXISTS (SELECT *
                  FROM <holiday table>
                  WHERE <day column> = @Today)
BEGIN
  -- special handling for holidays goes here
END;
替换为假日表的名称以及该表中保存日期的列。

您可以使用EXISTS检查该日期是否为假日,即假日表中存在该日期的记录

IF EXISTS (SELECT *
                  FROM <holiday table>
                  WHERE <day column> = @Today)
BEGIN
  -- special handling for holidays goes here
END;

替换为假日表的名称以及该表中包含日期的列。

我相信假日不需要静态表, 我现在用的是,

顺便说一句,您可以添加您的英国当地假日

CREATE FUNCTION [dbo].[fn_is_it_holiday](@country varchar(3),@date datetime) 
RETURNS bit
AS
BEGIN 
    declare @Tatilmi bit
    if @country in ('TR','TUR','792')
        select @Tatilmi = case 
            when datepart(dw,@date) in (7,1) then 1--Weekends
            when CONVERT(nchar,@date,131) like ' 2/10/%' then 1 --'Ramadan 1st'
            when CONVERT(nchar,@date,131) like ' 3/10/%' then 1 --'Ramadan 2nd'
            when CONVERT(nchar,@date,131) like ' 4/10/%' then 1 --'Ramadan 3rd'
            when CONVERT(nchar,@date,131) like '10/12/%' then 1 --'Sacrifice 1st'
            when CONVERT(nchar,@date,131) like '11/12/%' then 1 --'Sacrifice 2nd'
            when CONVERT(nchar,@date,131) like '12/12/%' then 1 --'Sacrifice 3nd'
            when CONVERT(nchar,@date,131) like '13/12/%' then 1 --'Sacrifice 4th'
            when CONVERT(varchar,@date, 121) like '____-01-01%' then 1 --'New Year'
            when CONVERT(varchar,@date, 121) like '____-04-23%' then 1 --'Children Day'
            when CONVERT(varchar,@date, 121) like '____-05-19%' then 1 --'Youht and Sports Day'
            when CONVERT(varchar,@date, 121) like '____-08-30%' then 1 --'Victory Day'
            when CONVERT(varchar,@date, 121) like '____-10-29%' then 1 --'Republic Day'
        else 0 end
    else if @country in ('US','USA','840')
        select @Tatilmi = case 
            when datepart(dw,@date) in (7,1) then 1--Weekends
            when CONVERT(varchar,@date, 121) like '____-01-01%' then 1 --'New Year'
            when CONVERT(varchar,@date, 121) like '____-07-04%' then 1 --'Independence'
            when CONVERT(varchar,@date, 121) like '____-11-11%' then 1 --'Veterans'
            when CONVERT(varchar,@date, 121) like '____-12-25%' then 1 --'X-Mas 1st'
            when CONVERT(varchar,@date, 121) like '____-12-26%' then 1 --'X-Mas 2st'
            when CONVERT(varchar,@date, 121) like '____-12-27%' then 1 --'X-Mas 3st'
            when CONVERT(varchar,@date, 121) like '____-12-28%' then 1 --'X-Mas 4th'
            when CONVERT(varchar,@date, 121) like '____-12-29%' then 1 --'X-Mas 5th'
            when CONVERT(varchar,@date, 121) like '____-12-30%' then 1 --'X-Mas 6th'
            when CONVERT(varchar,@date, 121) like '____-12-31%' then 1 --'X-Mas 7th'
            when dbo.fn_nth_weekday_of_month(5,4,10,year(@date))=@date then 1--Thanksgiving 
            when dbo.fn_nth_weekday_of_month(2,3,6,year(@date))=@date then 1--Martin Luther King
            when dbo.fn_nth_weekday_of_month(2,3,2,year(@date))=@date then 1--Birth Day of G.Washington and A.Lincoln
            when dbo.fn_nth_weekday_of_month(2,1,9,year(@date))=@date then 1--Workers
            when dbo.fn_nth_weekday_of_month(2,2,10,year(@date))=@date then 1--colombus
        else 0 end
    RETURN @Tatilmi
END


CREATEFUNCTION [dbo].[fn_nth_weekday_of_month](@Weekday int, @nth int, @month int, @year int) 
RETURNS datetime
AS
BEGIN 
    declare @iteration_date datetime, @i int=0
    set @iteration_date = convert(datetime,convert(varchar(4),@year)+'-'+convert(varchar(2),@month)+'-'+'01 00:00')
    while (year(@iteration_date)=@year)and(month(@iteration_date)=@month)
    begin
        if datepart(weekday,@iteration_date)=@Weekday
            set @i = @i + 1
        if @i = @nth
            break;
        set @iteration_date = dateadd(day,1,@iteration_date)
    end
    return @iteration_date
END

我相信你度假时不需要固定的桌子, 我现在用的是,

顺便说一句,您可以添加您的英国当地假日

CREATE FUNCTION [dbo].[fn_is_it_holiday](@country varchar(3),@date datetime) 
RETURNS bit
AS
BEGIN 
    declare @Tatilmi bit
    if @country in ('TR','TUR','792')
        select @Tatilmi = case 
            when datepart(dw,@date) in (7,1) then 1--Weekends
            when CONVERT(nchar,@date,131) like ' 2/10/%' then 1 --'Ramadan 1st'
            when CONVERT(nchar,@date,131) like ' 3/10/%' then 1 --'Ramadan 2nd'
            when CONVERT(nchar,@date,131) like ' 4/10/%' then 1 --'Ramadan 3rd'
            when CONVERT(nchar,@date,131) like '10/12/%' then 1 --'Sacrifice 1st'
            when CONVERT(nchar,@date,131) like '11/12/%' then 1 --'Sacrifice 2nd'
            when CONVERT(nchar,@date,131) like '12/12/%' then 1 --'Sacrifice 3nd'
            when CONVERT(nchar,@date,131) like '13/12/%' then 1 --'Sacrifice 4th'
            when CONVERT(varchar,@date, 121) like '____-01-01%' then 1 --'New Year'
            when CONVERT(varchar,@date, 121) like '____-04-23%' then 1 --'Children Day'
            when CONVERT(varchar,@date, 121) like '____-05-19%' then 1 --'Youht and Sports Day'
            when CONVERT(varchar,@date, 121) like '____-08-30%' then 1 --'Victory Day'
            when CONVERT(varchar,@date, 121) like '____-10-29%' then 1 --'Republic Day'
        else 0 end
    else if @country in ('US','USA','840')
        select @Tatilmi = case 
            when datepart(dw,@date) in (7,1) then 1--Weekends
            when CONVERT(varchar,@date, 121) like '____-01-01%' then 1 --'New Year'
            when CONVERT(varchar,@date, 121) like '____-07-04%' then 1 --'Independence'
            when CONVERT(varchar,@date, 121) like '____-11-11%' then 1 --'Veterans'
            when CONVERT(varchar,@date, 121) like '____-12-25%' then 1 --'X-Mas 1st'
            when CONVERT(varchar,@date, 121) like '____-12-26%' then 1 --'X-Mas 2st'
            when CONVERT(varchar,@date, 121) like '____-12-27%' then 1 --'X-Mas 3st'
            when CONVERT(varchar,@date, 121) like '____-12-28%' then 1 --'X-Mas 4th'
            when CONVERT(varchar,@date, 121) like '____-12-29%' then 1 --'X-Mas 5th'
            when CONVERT(varchar,@date, 121) like '____-12-30%' then 1 --'X-Mas 6th'
            when CONVERT(varchar,@date, 121) like '____-12-31%' then 1 --'X-Mas 7th'
            when dbo.fn_nth_weekday_of_month(5,4,10,year(@date))=@date then 1--Thanksgiving 
            when dbo.fn_nth_weekday_of_month(2,3,6,year(@date))=@date then 1--Martin Luther King
            when dbo.fn_nth_weekday_of_month(2,3,2,year(@date))=@date then 1--Birth Day of G.Washington and A.Lincoln
            when dbo.fn_nth_weekday_of_month(2,1,9,year(@date))=@date then 1--Workers
            when dbo.fn_nth_weekday_of_month(2,2,10,year(@date))=@date then 1--colombus
        else 0 end
    RETURN @Tatilmi
END


CREATEFUNCTION [dbo].[fn_nth_weekday_of_month](@Weekday int, @nth int, @month int, @year int) 
RETURNS datetime
AS
BEGIN 
    declare @iteration_date datetime, @i int=0
    set @iteration_date = convert(datetime,convert(varchar(4),@year)+'-'+convert(varchar(2),@month)+'-'+'01 00:00')
    while (year(@iteration_date)=@year)and(month(@iteration_date)=@month)
    begin
        if datepart(weekday,@iteration_date)=@Weekday
            set @i = @i + 1
        if @i = @nth
            break;
        set @iteration_date = dateadd(day,1,@iteration_date)
    end
    return @iteration_date
END

发生在结尾我是sql新手,我的任务是在哪个国家/地区的公共假日实现这一点?@TimBiegeleisen他有一张表格,开始一组一组地思考。如果日历表每天只有一行,则可以将该表连接到另一个结果集,或将其作为编写此查询的基础。它肯定会有一些列,指出这是否是一个正常的工作日、假日、周末等等。尽量不要在这里编写过程代码。有些人一想到每天排一行是多么的浪费就心惊胆战,根本没有想到20年的数据量到最后还不到10000行。我对sql是新手,被派去在哪个国家的这个存储的procBank/公共假日实现这一点?@TimBiegeleisen他有一个表格,可以从一组开始思考。如果日历表每天只有一行,则可以将该表连接到另一个结果集,或将其作为编写此查询的基础。它肯定会有一些列,指出这是否是一个正常的工作日、假日、周末等等。尽量不要在这里编写过程代码。有些人一想到每天的一行数据是多么浪费就感到害怕,没有想到20年的数据仍然不足10000行。选择NULL比选择*更有效一点——不需要返回数据。我的意思是,你需要一个千分尺和一个奥运会级别的秒表来测量它,但是如果代码每天执行一百万次,它就会累加起来。@Brian:在一个存在中,所选列的列表根本不重要。引擎将忽略它,表达式不会求值,也不会返回任何数据。尝试选择1/0。您可能会遇到被零除的错误。错误,但你不会得到一个。对于EXISTS,SELECT*可以。@Brian:在IF EXISTS的情况下-不返回任何数据-因此使用SELECT*还是SELECT NULL完全没有任何区别。返回的唯一内容是指示是否有任何数据与WHERE子句匹配exists@Brian-仅当您正在处理SQL Server 6.5或更高版本之类的内容时。对于大多数其他数据库系统也是如此。这是几十年前的建议,但在2018年并不适用。选择NULL比选择*,效率会稍微高一点——不需要返回数据。我的意思是,你需要一个千分尺和一个奥运会级别的秒表来测量它,但是如果代码每天执行一百万次,它就会累加起来。@Brian:在一个存在中,所选列的列表根本不重要。引擎将忽略它,表达式不会求值,也不会返回任何数据。尝试选择1/0。您可能会遇到被零除的错误。错误,但你不会得到一个。对于EXISTS,SELECT*可以。@Brian:在IF EXISTS的情况下-不返回任何数据-因此使用SELECT*还是SELECT NULL完全没有任何区别。返回的唯一内容是指示是否有任何数据与WHERE子句匹配exists@Brian-仅当您正在处理SQL Server 6.5或更高版本之类的内容时。对于大多数其他数据库系统也是如此。这是几十年前的相关建议,但在2018年并不适用。