【问题标题】:SQL Server query to get next nearest date from recurring eventsSQL Server 查询以从重复事件中获取下一个最近的日期
【发布时间】:2016-06-28 06:55:42
【问题描述】:

这是我的场景。我有一张带有FirstMaintenanceEventDate 的表格,并且某些数据在FirstMaintenanceEventDate 的某些天后重复。我需要通过 SQL Server 查询找出其中每一行的最近日期。

例如:有一个数据行FirstMaintenanceEventDate 是上个月,它将在下个月的 40 天后重复。同样,这里也有很多活动。他们中的一些人将来有FirstMaintenanceEventDate。在所有这些项目中,我需要为每一行获取最近的日期。

我可以在不考虑重复过程的情况下获得最近的日期。

这是我的查询

SELECT TOP 1 *
FROM FIS_MaintenanceEventInstance
WHERE VehicleName = '600-GUR' 
  AND FirstMaintenanceEventDate >= GETDATE() 
ORDER BY FirstMaintenanceEventDate ASC

需要更新它以考虑重复事件,如上所述。可能是这样,但这是不正确的。

SELECT TOP 1 *
FROM FIS_MaintenanceEventInstance
WHERE 
    VehicleName = '600-GUR' 
    AND FirstMaintenanceEventDate >= GETDATE()
    AND CASE 
           WHEN FirstMaintenanceEventDate < GETDATE() 
              THEN (Getdate() + RecurringDays) 
        END 
ORDER BY FirstMaintenanceEventDate ASC

任何建议将不胜感激。

注意:如果您需要更多信息,请现在告诉我。

已编辑 正如 Jatin Patel 在下面的回答中建议的那样,我已经尝试过关注查询。

SELECT TOP 1 *, 
    CASE WHEN  FirstMaintenanceEventDate < GETDATE() THEN DateAdd(day,RecurringDays,FirstMaintenanceEventDate)
     ELSE FirstMaintenanceEventDate END AS MaintenanceEventDate
FROM FIS_MaintenanceEventInstance
WHERE VehicleName ='600-GUR' 
ORDER BY MaintenanceEventDate ASC

这没有按预期工作。在计算重复日期(这里是 MaintenanceEventDate)之后,还应该考虑何时获得最近的日期。根据此查询,如果它是过去的,则计算重复日期(MaintenanceEventDate)并返回它而不检查表中的其他日期。

【问题讨论】:

  • 现在你说的是mysql 还是mssql?你把两个名字混在一起......
  • 如果您的WHERE 子句中有FirstMaintenanceEventDate &gt;= GETDATE(),那么CASE 中的表达式:WHEN FirstMaintenanceEventDate &lt; GETDATE() 可以永远是的 - 所以整个 CASE 表达式是无用的,不会有任何帮助.....
  • @arkascha 对不起,如果我让你感到困惑。这是 mssql。
  • @marc_s 我知道第二个查询不正确。那么您有什么想法可以完成这项工作,否则我是否必须使用单独的计算来找出重复日期而不使用相同的查询?

标签: sql sql-server date


【解决方案1】:

试试这个,

SELECT TOP 1 *, 
    CASE WHEN  FirstMaintenanceEventDate < GETDATE() THEN (Getdate()+RecurringDays) ELSE FirstMaintenanceEventDate END AS MaintenanceEventDate
FROM FIS_MaintenanceEventInstance
WHERE VehicleName ='600-GUR' 
ORDER BY MaintenanceEventDate ASC

【讨论】:

  • 谢谢。你的答案接近我的要求但是这里“(Getdate()+RecurringDays)”应该更改为“(FirstMaintenanceEventDate+RecurringDays)”。当我尝试它时,出现“操作数类型冲突:日期与 int 不兼容”的错误。 “FirstMaintenanceEventDate”是日期类型。你有什么想法来纠正它吗?
  • 我可以将其更正为“SELECT TOP 1 *, CASE WHEN FirstMaintenanceEventDate
  • 我不确定我是否理解正确,但如果你的意思是说 FirstMaintenanceEventDate 日期只为一个事件输入一次,你需要计算它直到不久的将来日期的重复发生而不是替换这个"DateAdd(day,RecurringDays,FirstMaintenanceEventDate)" 与 "DateAdd(day,RecurringDays*(DateDiff(day,FirstMaintenanceEventDate,GetDate())/RecurringDays + 1) ,FirstMaintenanceEventDate)"
猜你喜欢
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多