【问题标题】:Relative Date Calculation Algorithm in SQLSQL中的相对日期计算算法
【发布时间】:2012-03-14 19:18:15
【问题描述】:

我需要计算作业的下一个月运行时间,这可以使用两个参数指定,这些参数可以从

中获取值

参数一:
1 代表星期日,2 代表星期一,3 代表星期二,4 代表星期三,5 代表星期四,6 代表星期五,7 代表星期六,8 代表白天,9 代表工作日,10 代表周末

参数二:
1 代表第一,2 代表第二,4 代表第三,8 代表第四,16 代表最后

根据这两个参数,您可以指定运行时间,例如每月的第一个工作日或每月的最后一个星期日。

我如何使用一个知道当前日期、para1 和 para2 的存储过程到达这个日期

【问题讨论】:

  • @Ben 创建这样的标签是粗鲁和不恰当的。如果您觉得提问者没有做出足够的努力,请对该问题投反对票。
  • @YiJiang,很公平。因要求 SO 为他工作而被否决。
  • @Ben 我试图解决但不知道如何解决。我花了几个小时才在这里发帖。我认为这是一个有趣的问题,并且网上没有太多关于这个问题的材料。希望我没有冒犯任何人。

标签: sql sql-server-2008 datetime dateadd


【解决方案1】:
create function schema.get_next_run_date(@day int, @week int)
returns datetime
as
begin
declare @rtResult datetime
declare @frstDayOfMonth datetime
set @frstDayOfMonth = SELECT TRUNC(current_date, 'MM') FROM dual
if @day <= 7
    set @rtResult = SELECT NEXT_DAY(@frstDayOfMonth + ((parm2-1)*7) day, param1) "NEXT DAY" FROM DUAL
else if @day = 8
    set @rtResult = SELECT NEXT_DAY(@frstDayOfMonth + pamr2) "NEXT DAY" FROM DUAL
else if @day = 9
    declare intDay int
    set @intDay = datepart(weekday, @frstDayOfMonth)
    if (@intDay between 2 and 6)
        set @rtResult = @frstDayOfMonth
    else if (@intDay = 1)
        set @rtResult = @frstDayOfMonth + 1 day
    else
        set @rtResult = @frstDayOfMonth + 2 day
else if @day = 10
    declare intDay int
    set @intDay = datepart(weekday, @frstDayOfMonth)
    if (@intDay between 2 and 6)
        set @rtResult = @frstDayOfMonth + 7 - @intDay
    else
        set @rtResult = @frstDayOfMonth
else
    set @rtResult = null
return @rtResult
end
go

未测试。但我希望这会有所帮助。如果日期已经过期,您可能希望返回 null。

【讨论】:

  • 这是混合 PL/SQL 和 T-SQL 并且包含几个与混合语法无关的错误。
  • 是的..这是我第一次编写 pl/sql 函数..但想法就在那里......将其视为伪代码
  • 这很棒。我现在知道该怎么做。
【解决方案2】:

这可能会让您入门。取自:How-to-get-the-Nth-weekday-of-a-month

CREATE FUNCTION dbo.fnGetNthWeekdayOfMonth
(
 @theDate DATETIME,
 @theWeekday TINYINT,
 @theNth SMALLINT
)
RETURNS DATETIME
BEGIN
  RETURN  (
            SELECT  theDate
            FROM    (
                        SELECT  DATEADD(DAY, 7 * @theNth - 7 * SIGN(SIGN(@theNth) + 1) +(@theWeekday + 6 - DATEDIFF(DAY, '17530101', DATEADD(MONTH, DATEDIFF(MONTH, @theNth, @theDate), '19000101')) % 7) % 7, DATEADD(MONTH, DATEDIFF(MONTH, @theNth, @theDate), '19000101')) AS theDate
                        WHERE   @theWeekday BETWEEN 1 AND 7
                                AND @theNth IN (-5, -4, -3, -2, -1, 1, 2, 3, 4, 5)
                    ) AS d
            WHERE   DATEDIFF(MONTH, theDate, @theDate) = 0
        )
END

这不是你要找的,但应该涵盖主要部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多