所以我正在用Access SQL做一个项目,进展很好。我已经学到了很多有关Access和VBA的知识,这个站点在此过程中很有帮助。
现在,我面临的问题是性能,并且由于我对这种SQL工作的经验很少,因此来这里考虑一下。
我有一个约20个表的关系数据库,其中包含约100个路段,这些路段代表路线的一部分。Access数据库本质上是一个地图,在该地图上我绘制了一些路线(通过线),这些路线可以动态上色-
颜色由特定问题确定并从数据库中计算出来。
这是一张图片,可以更好地解释它。您不能单击访问中的线条,因此按钮的颜色和宽度设置为与线条相同,并且可以单击以获取更多信息。
用户可以选择一个日期,它会根据询问的问题显示路线的进度。到目前为止,这些问题始终是二进制“是或否”(绿色或红色)。
我发现由于查询的复杂性,我不得不在启动时为每个查询准备一个临时数据库,否则就无法顺利滚动日期。
所以无论如何这是我的具体问题:
路线的每个部分在某个日期可以处于不同的阶段(考虑构造)。从“阶段0”到“完成”
将执行代表项目阶段的新行。所有部分大约有8个可能的阶段,这些阶段可能在不同的时间发生-事情是这样-每个部分的顺序不同,而且并非所有阶段都在所有部分上发生。
我在数据库中拥有的只是每个阶段的开始日期,而不是结束日期。阶段的顺序几乎取决于开始日期的顺序。每个阶段至少每个阶段只能发生一次,因此是这样。如您所见,对于这种以性能为中心的程序而言,这是一件卑鄙的事情。
我确定它将涉及一个或几个临时数据库。我的想法:
将所有日期汇总到新表的一行中。由于设置了阶段数,因此每个阶段都有相应的列-如果需要,则在何时开始和在何时结束。现在需要遍历每个循环,并检查用户日期是否落入哪个阶段。因此:“ SectionID-phase1needed phase1start phase1end .....”
优点:
它使数据库保持较小的
劣势:
实际的循环需要经历所有阶段(最坏的情况)才能找到正确的阶段。
计算一个新的数据库,该数据库只是“ IdSection-Date-Phase”,并为一个区间中的每个“节”和“每天”计算一个阶段。
优势:
这样可以将运行时计算保持为每节一个查询
访问应该处理大量数据
缺点:
我无法手动检查所有部分的操作是否正确
现在,我问您希望使用哪一种,或者是否有其他方法?我不能真正改变我拥有的数据点。
简而言之,我必须显示不同阶段的时间间隔,并且在数据库中,我只有开始时间点,没有阶段的完整顺序。
谢谢您的想法,在这些方面的任何经验都将对您有所帮助
如果我对您的理解正确,那么您将获得一系列类似于以下形式的数据:
Section 1, Phase 7, Start Date = 11/07/2012
Section 1, Phase 2, Start Date = 12/14/2012
Section 1, Phase 3, Start Date = 12/28/2012
Section 2, Phase 1, Start Date = 11/04/2012
Section 2, Phase 9, Start Date = 12/30/2012
Section 3, Phase 4, Start Date = 11/19/2012
Section 3, Phase 5, Start Date = 12/06/2012
Section 3, Phase 3, Start Date = 12/11/2012
并且您想回答“ 2012年12月15日每个部分处于哪个阶段?”之类的问题,对吗?
在这种情况下,答案应类似于以下形式:
Section 1, Phase 2
Section 2, Phase 1
Section 3, Phase 3
为此,我假设您有一个名为SECTION_PHASES的表,其中包含以下字段:
SECTION Number
PHASE Number
START_DATE Date/Time
您需要做的是找出当前输入日期之前每个部分的最大开始日期,因为那是下一个阶段更改之前最近的活动阶段。完成此操作后,您可以将该信息重新添加到主表中,以确定该日期之后的阶段。
您需要执行一个查询SECTION_MAX_DATES,然后在其SQL视图中具有以下代码:
SELECT [SECTION_PHASES].SECTION, Max([SECTION_PHASES].START_DATE) AS target_date
FROM SECTION_PHASES
WHERE [SECTION_PHASES].START_DATE<#12/15/2012#
GROUP BY [SECTION_PHASES].SECTION
ORDER BY [SECTION_PHASES].SECTION;
保存该查询后,您可以将其作为子查询加入到原始表中。现在,进行另一个查询SECTION_PHASE_AT_DATE,其中包括您的原始表和上一个查询,然后在其SQL视图中输入以下代码:
SELECT SECTION_PHASES.SECTION, SECTION_PHASES.PHASE, SECTION_PHASES.START_DATE
FROM SECTION_MAX_DATES INNER JOIN SECTION_PHASES ON (SECTION_MAX_DATES.target_date=SECTION_PHASES.START_DATE) AND (SECTION_MAX_DATES.SECTION=SECTION_PHASES.SECTION)
ORDER BY SECTION_PHASES.SECTION;
如果我正确理解了您的问题,该查询将为您提供所追求的结果。如果我能正确理解给定阶段的新开始日期指示新日期之前以前是当前任何阶段的结束,则无需计算结束日期。
您仍然需要解决一些极端情况,例如,如果某个节在给定日期之前尚未注册阶段,则会发生什么情况。我还将留给您了解如何在两个查询中的第一个查询的WHERE子句中参数化日期,考虑到已经取得的进步,这对于您来说可能是微不足道的!但是,我认为这是您要解决问题的数据/计算部分的SQL结构。
问题内容: 是否可以使用NOW()将默认时间添加为10分钟? 我已经尝试过类似的方法: 但是,它不起作用。 问题答案: 我不认为你可以做到这一点。 在MySQL的文件指出: 数据类型规范中的DEFAULT value子句指示列的默认值。除一个例外,默认值必须为常数;否则为0。它不能是函数或表达式。例如,这意味着您不能将日期列的默认值设置为诸如NOW()或CURRENT_DATE之类的函数的值。唯一
问题内容: 我正在对jdbc操作使用Spring JDBC模板。由于我使用的是BeanPropertySqlParameterSource,因此将bean的START_TIME变量分配为java.sql.date类型。在Oracle数据库中,该列被称为“ DATE”类型(并且没有TIMESTAMP类型,即使数据库为10.2 ver) 现在当我设定 它以日期和时间戳记存储为00:00:00 请告诉我
我的问题是,我也希望以这样的格式存储出生日期。现在,我可以将01-01-1900作为开始日期,并将自该日期以来的天数存储在int中。虽然我很肯定这会很好,但感觉像是epoch是一个很好的概念,但生日的感觉像是我在建立自己的惯例,这是我通常喜欢避免的。 对于将日期存储标准化为一个数字,是否有任何既定的标准?哪一个日期应该是比较基准日期?
我正试图将这些值插入到oracle数据库中,但我又犯了一个错误: 错误为:ORA-01843:不是有效月份 几个小时来一直试图解决这个问题,但我找不到问题!请帮忙!。 信息[http-8080-2](ecsystem.java:233)-2013-11-22 15:34:55.0\2013-11-22 15:34:55.0 希望这些信息能有所帮助!
问题内容: 我想设计一个数据库,描述如下:每个产品在一个时间点只有一个状态。但是,产品的状态可能会在其生命周期内发生变化。如何设计产品和状态之间的关系,以便在当前时间轻松查询所有具有特定状态的产品?另外,有人可以给我一些与设计时间有关的设计数据库的详细信息吗?谢谢你的帮助 问题答案: 这是一个满足您指定要求的模型。 链接到时间序列数据模型 对于不熟悉关系建模标准的人,请 链接到IDEF1X符号 。
问题内容: 我有两个LocalDate,它们代表某个时间间隔。现在,我必须获取此间隔包含的所有星期五的LocalDates。最简单的方法吗? 问题答案: 解决方案:懒惰地走一个星期。 测试