如何在SQL中计算年、月、日等的偏移量

如何在SQL中计算年、月、日等的偏移量,sql,sql-server,date,offset,Sql,Sql Server,Date,Offset,我们使用的零售日历(445)与常规日历不同。一年从十月开始,每个月的第一天并不是这个月真正的第一天。例如,对于本财年(2020年),11月开始于10月6日,结束于11月2日,明年将有不同的日期 我需要创建一个偏移字段,根据该日历计算两个时间点之间的差异 例如,如果今天是12月3日,则数据应如下所示: 计算应该是动态的,并且每次都比较今天的日期和第二个日期(过去/未来/现在的日期) 我使用了很多种脚本,但没有一种可以使用这种日历。下面是一个代码示例(我们使用T-SQL数据库): 案例 Cal.F

我们使用的零售日历(445)与常规日历不同。一年从十月开始,每个月的第一天并不是这个月真正的第一天。例如,对于本财年(2020年),11月开始于10月6日,结束于11月2日,明年将有不同的日期

我需要创建一个偏移字段,根据该日历计算两个时间点之间的差异

例如,如果今天是12月3日,则数据应如下所示:

计算应该是动态的,并且每次都比较今天的日期和第二个日期(过去/未来/现在的日期)

我使用了很多种脚本,但没有一种可以使用这种日历。下面是一个代码示例(我们使用T-SQL数据库):

案例
Cal.FiscalYear=年份时(getdate())
然后0
当Cal.FiscalYear<年份时(getdate())
然后(Cal.FiscalYear-year(getdate()))
其他(Cal.FiscalYear-year(getdate()))
结束时为当前的财政赤字

使用您提供的数据,这将为您提供大部分信息。至于您的会计日历,为了知道如何处理其他日期,您的会计年度日历将需要定义

DECLARE @Date DATE = GETDATE();

DECLARE @FiscalYear TABLE
(
    FiscalYear  INT
    ,StartDate  DATE
    ,EndDate    DATE
)
INSERT INTO @FiscalYear (FiscalYear,StartDate,EndDate)
SELECT  2020,'10/6/2019','11/2/2020'

SELECT  t.dDate
        ,DATEDIFF(DAY, @Date, t.dDate) AS CurDayOffset
        ,DATEDIFF(WEEK, @Date, t.dDate) AS CurWeekOffset
        ,DATEDIFF(MONTH, @Date, t.dDate) AS CurMonthOffset
        ,CASE 
            WHEN @Date BETWEEN fy.StartDate AND fy.EndDate THEN 0
        END AS FiscalYearOffset
FROM    (
            SELECT  '10/8/2018' AS dDate
            UNION ALL
            SELECT  '12/3/2019'
            UNION ALL
            SELECT  '12/4/2019'
            UNION ALL
            SELECT  '10/2/2020'
            UNION ALL
            SELECT  '10/5/2020'
    ) AS t
    LEFT OUTER JOIN @FiscalYear AS fy ON t.dDate BETWEEN fy.StartDate AND fy.EndDate;

您使用的是哪种数据库管理系统?(说到日期/时间,许多产品远远不符合ANSI SQL。例如,
getdate()
是一个特定于产品的函数。)嘿,示例数据很棒,但不是作为注释。改为编辑问题。史蒂夫,我有我的“445日历”,知道每个月的开始和结束时间以及年份,所以我不需要计算日历本身。。445表示月份将有4、4和5周,例如,10月将有4周,11月-4周,12月5周,1月-4日,2月-4日,3月-5日,等等。我的问题是计算这个偏移量。这是我的日程表:澄清山姆的评论:他的问题经过编辑,添加了一个指向445日历图片的链接。
DECLARE @Date DATE = GETDATE();

DECLARE @FiscalYear TABLE
(
    FiscalYear  INT
    ,StartDate  DATE
    ,EndDate    DATE
)
INSERT INTO @FiscalYear (FiscalYear,StartDate,EndDate)
SELECT  2020,'10/6/2019','11/2/2020'

SELECT  t.dDate
        ,DATEDIFF(DAY, @Date, t.dDate) AS CurDayOffset
        ,DATEDIFF(WEEK, @Date, t.dDate) AS CurWeekOffset
        ,DATEDIFF(MONTH, @Date, t.dDate) AS CurMonthOffset
        ,CASE 
            WHEN @Date BETWEEN fy.StartDate AND fy.EndDate THEN 0
        END AS FiscalYearOffset
FROM    (
            SELECT  '10/8/2018' AS dDate
            UNION ALL
            SELECT  '12/3/2019'
            UNION ALL
            SELECT  '12/4/2019'
            UNION ALL
            SELECT  '10/2/2020'
            UNION ALL
            SELECT  '10/5/2020'
    ) AS t
    LEFT OUTER JOIN @FiscalYear AS fy ON t.dDate BETWEEN fy.StartDate AND fy.EndDate;