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