根据smallint和datetime2的组合计算年份(7)

时间:2014-07-02 17:29:05

标签: sql sql-server sql-server-2008

我希望我能正确解释这个......

我有这张桌子:

[InspectionSchedule] [smallint] NULL,
[NeedsAssesment] [smallint] NULL,
[DateLastInspected] [datetime2](7) NULL,

让我们说DateLastInspected在全球范围内2010-01-01 00:00:00.0000000

InspectionSchedule的值为1,5或10,代表必须检查资产的这么多年。

我希望获得有关DateLastInspected的简单查询的帮助,为其添加InspectionSchedule的值,并在将来返回一年,n年。我知道这是用CAST运算符完成的,但我从那里迷路了。

在这里,它变得棘手:未来n年,我们只需要一年,即未来N年,基于财政年度(10月1日)。例如,如果资产在2010-07-30 00:00:00.0000000上检查,即09财年,并且是在5年的检查周期,那么这个"数学"将作为" 2014"返回下一个检查年度。我希望这是有道理的。我确定这是加入一堆CASTS和DATEPARTS的简单问题,但我甚至不知道从哪里开始。

5 个答案:

答案 0 :(得分:1)

您可以使用此类代码:

SELECT DATEPART(YEAR, DATEADD(MONTH, -9, DATEADD(YEAR, [InspectionSchedule], [DateLastInspected])))

它有三件事:

  1. 添加上次检查的检查计划年数。我们得到下一次检查的日期。
  2. 从此日期起删除9个月,以便从会计年度转换为实际年度
  3. 仅采用年份值

答案 1 :(得分:0)

您可以使用DATEADD()InspectionSchedule添加到DateLastInspected,然后使用YEAR()功能获取年份。这些方面的东西:

SELECT YEAR(DATEADD(YEAR,InspectionSchedule,DateLastInspected))

现在,确定DateLastInspected是否属于哪个财政年度是另一回事。

答案 2 :(得分:0)

您应该使用SQL DATEADD(datepart,number,date)功能:与您的案例DATEADD(year,number,date)相关。 RGDS,

答案 3 :(得分:0)

我相信以下内容会为您提供所需内容:

select datepart(yyyy, dateadd(yy, InspectionSchedule, DateLastInspected))
from <YourTableName>

编辑:如果您希望结果是下次检查的会计年度,您将需要为最后检查日期是在01 - 10月之前或之后添加测试,并添加1到日历年,以获得您的会计年度,如下:

select datepart(yyyy, dateadd(yy, InspectionSchedule, DateLastInspected)) + 
    case when datepart(MM, DateLastInspected) >= 10 then 1 else 0 end
from <YourTableName>

答案 4 :(得分:0)

我认为这会更优雅......

IF (UPDATE(DateLastInspected) OR UPDATE (InspectionSchedule))
   BEGIN
UPDATE [table] SET NeedsAssesment = DATEPART(YEAR, DATEADD(MONTH, +3, DateLastInspected))+     InspectionSchedule
   END

我会使用触发器,但那只是我。祝你好运tpcolson