访问查询:通过扭曲获取日期差异
Access Query: get difference of dates with a twist
我会尽力解释这一点,如果我的解释有点尴尬,我提前道歉。如果我在某个地方有雾,请告诉我什么可以帮助你。
我有一个 table 装满了电路和日期。每个电路在大约 36 个月或 48 个月的时间周期内得到 trim 治疗。我有一个专栏可以提供此信息。每次 a 电路的 trim 周期完成时,我都有一个记录。我正在尝试 link 已知电路中断列表,table 及其中断数据,table 电路的 trim 历史记录。扭曲如下:
我只想取回超过 trim 周期 6 个月的电路。所以我需要获取电路的所有记录,查看每个单独的记录,找到与当前正在检查的记录相关的最近的先前记录(我需要单独检查每条记录),计算两个记录之间的差异(以月为单位) , 然后 return 仅记录给定馈线的任何两个条目之间的差异超过 6 个月。
以下是数据示例:
+----+--------+----------+-------+
| ID | feeder | comp | cycle |
| 1 | 123456 | 1/1/2001 | 36 |
| 2 | 123456 | 1/1/2004 | 36 |
| 3 | 123456 | 7/1/2007 | 36 |
| 4 | 123456 | 3/1/2011 | 36 |
| 5 | 123456 | 1/1/2014 | 36 |
+----+--------+----------+-------+
这是我想要的结果集示例(请注意:循环可能因电路而异,因此循环列中的值需要在计算中确定我是否在 trim 分钟之间超过了 6 个月的周期):
+----+--------+----------+-------+
| ID | feeder | comp | cycle |
| 3 | 123456 | 7/1/2007 | 36 |
| 4 | 123456 | 3/1/2011 | 36 |
+----+--------+----------+-------+
这是我开始的查询,但我很难确定如何正确计算日期:
SELECT temp_feederList.Feeder, Temp_outagesInfo.causeType, Temp_outagesInfo.StormNameThunder, Temp_outagesInfo.deviceGroup, Temp_outagesInfo.beginTime, tbl_Trim_History.COMP, tbl_Trim_History.CYCLE
FROM (temp_feederList
LEFT JOIN Temp_outagesInfo ON temp_feederList.Feeder = Temp_outagesInfo.Feeder)
LEFT JOIN tbl_Trim_History ON Temp_outagesInfo.Feeder = tbl_Trim_History.CIRCUIT_ID;
我真的无法弄清楚我需要从这里到哪里才能获取最新条目并执行数学比较。我以前从未被要求做 SQL 如此复杂的事情,所以我要感谢你们所有人的耐心和愿意提供的任何帮助。
我在做一些假设,但这使用子查询为您提供供给列表中的行,其中上一个完成日期大于循环指示的月数之前:
SELECT tbl_Trim_History.ID, tbl_Trim_History.feeder,
tbl_Trim_History.comp, tbl_Trim_History.cycle
FROM tbl_Trim_History
WHERE tbl_Trim_History.comp>
(SELECT Max(DateAdd("m", tbl_Trim_History.cycle, comp))
FROM tbl_Trim_History T2
WHERE T2.feeder = tbl_Trim_History.feeder AND
T2.comp < tbl_Trim_History.comp)
如果您需要检查超过 36 个月的时间,您可以向 DateAdd 函数计算的月份添加任意值。
我也不知道cycle的值是指从上一个周期开始的月数还是到下一个周期的月数。如果是后者,我会将 DateAdd 函数中的 tbl_Trim_History.cycle 更改为仅循环。
SELECT tbl_trim_history.ID, tbl_trim_history.Feeder,
tbl_trim_history.Comp, tbl_trim_history.Cycle,
(select max(comp) from tbl_trim_history T
where T.feeder=tbl_trim_history.feeder and
t.comp<tbl_trim_history.comp) AS PriorComp,
IIf(DateDiff("m",[priorcomp],[comp])>36,"x") AS [Select]
FROM tbl_trim_history;
此查询标识(在最后一列中带有 X)来自 tbl_trim_history 的超过周期时间的记录 - 但如评论中所述,我不完全确定这是否是您需要的或不是,或者如何合并其他 2 个表。一旦您看到它在做什么,您就可以修改它以仅保留您需要的记录。
我会尽力解释这一点,如果我的解释有点尴尬,我提前道歉。如果我在某个地方有雾,请告诉我什么可以帮助你。
我有一个 table 装满了电路和日期。每个电路在大约 36 个月或 48 个月的时间周期内得到 trim 治疗。我有一个专栏可以提供此信息。每次 a 电路的 trim 周期完成时,我都有一个记录。我正在尝试 link 已知电路中断列表,table 及其中断数据,table 电路的 trim 历史记录。扭曲如下:
我只想取回超过 trim 周期 6 个月的电路。所以我需要获取电路的所有记录,查看每个单独的记录,找到与当前正在检查的记录相关的最近的先前记录(我需要单独检查每条记录),计算两个记录之间的差异(以月为单位) , 然后 return 仅记录给定馈线的任何两个条目之间的差异超过 6 个月。
以下是数据示例:
+----+--------+----------+-------+
| ID | feeder | comp | cycle |
| 1 | 123456 | 1/1/2001 | 36 |
| 2 | 123456 | 1/1/2004 | 36 |
| 3 | 123456 | 7/1/2007 | 36 |
| 4 | 123456 | 3/1/2011 | 36 |
| 5 | 123456 | 1/1/2014 | 36 |
+----+--------+----------+-------+
这是我想要的结果集示例(请注意:循环可能因电路而异,因此循环列中的值需要在计算中确定我是否在 trim 分钟之间超过了 6 个月的周期):
+----+--------+----------+-------+
| ID | feeder | comp | cycle |
| 3 | 123456 | 7/1/2007 | 36 |
| 4 | 123456 | 3/1/2011 | 36 |
+----+--------+----------+-------+
这是我开始的查询,但我很难确定如何正确计算日期:
SELECT temp_feederList.Feeder, Temp_outagesInfo.causeType, Temp_outagesInfo.StormNameThunder, Temp_outagesInfo.deviceGroup, Temp_outagesInfo.beginTime, tbl_Trim_History.COMP, tbl_Trim_History.CYCLE
FROM (temp_feederList
LEFT JOIN Temp_outagesInfo ON temp_feederList.Feeder = Temp_outagesInfo.Feeder)
LEFT JOIN tbl_Trim_History ON Temp_outagesInfo.Feeder = tbl_Trim_History.CIRCUIT_ID;
我真的无法弄清楚我需要从这里到哪里才能获取最新条目并执行数学比较。我以前从未被要求做 SQL 如此复杂的事情,所以我要感谢你们所有人的耐心和愿意提供的任何帮助。
我在做一些假设,但这使用子查询为您提供供给列表中的行,其中上一个完成日期大于循环指示的月数之前:
SELECT tbl_Trim_History.ID, tbl_Trim_History.feeder,
tbl_Trim_History.comp, tbl_Trim_History.cycle
FROM tbl_Trim_History
WHERE tbl_Trim_History.comp>
(SELECT Max(DateAdd("m", tbl_Trim_History.cycle, comp))
FROM tbl_Trim_History T2
WHERE T2.feeder = tbl_Trim_History.feeder AND
T2.comp < tbl_Trim_History.comp)
如果您需要检查超过 36 个月的时间,您可以向 DateAdd 函数计算的月份添加任意值。
我也不知道cycle的值是指从上一个周期开始的月数还是到下一个周期的月数。如果是后者,我会将 DateAdd 函数中的 tbl_Trim_History.cycle 更改为仅循环。
SELECT tbl_trim_history.ID, tbl_trim_history.Feeder,
tbl_trim_history.Comp, tbl_trim_history.Cycle,
(select max(comp) from tbl_trim_history T
where T.feeder=tbl_trim_history.feeder and
t.comp<tbl_trim_history.comp) AS PriorComp,
IIf(DateDiff("m",[priorcomp],[comp])>36,"x") AS [Select]
FROM tbl_trim_history;
此查询标识(在最后一列中带有 X)来自 tbl_trim_history 的超过周期时间的记录 - 但如评论中所述,我不完全确定这是否是您需要的或不是,或者如何合并其他 2 个表。一旦您看到它在做什么,您就可以修改它以仅保留您需要的记录。