回答

收藏

日期/时间点/间隔(相关)数据库性能

技术问答 技术问答 193 人阅读 | 0 人回复 | 2023-09-14

所以我在用Access SQL做一个项目,进展很好。我学到了很多。Access和VBA这个网站在这个过程中对知识很有帮助。9 F4 C; N; V" Z: l. `
现在,我面临的问题是性能,因为我对此SQL工作经验很少,来这里想想。( x1 Z3 B4 k* _  v; C( ^/ a
我有一个约20个表的关系数据库,包括约100个路段,代表路线的一部分。Access数据库本质上是一张地图,我在地图上画了一些路线(通过线),可以动态着色-
8 I9 Q! ]8 T, e; f: H颜色由具体问题确定,并从数据库中计算。3 U9 ]) Z' x# Y  v
这是一张可以更好地解释的图片。您不能单击访问中的线,因此按钮的颜色和宽度与线相同,您可以单击以获取更多信息。8 b5 M2 B  R3 V, X. H

2 |' Y+ ^& {+ p# O+ a, @+ P/ R0 T用户可以根据询问的问题选择一个日期来显示路线的进度。到目前为止,这些问题一直是二进制的是否(绿色或红色)。+ T$ v. s; q8 R. s5 f
我发现,由于查询的复杂性,我必须在开始时为每个查询准备一个临时数据库,否则日期将无法顺利滚动。. u0 f& Y4 ~1 m4 ^% Y' F) w/ f& v; K
所以这是我的具体问题:  V9 ]4 M# ^( S6 u$ _) v
路线的每个部分都可以在某个日期处于不同的阶段(考虑结构)。从阶段0到完成
# k/ C' U! P) s8 i& ?将执行代表项目阶段的新行。大约有8个可能的阶段,可能会在不同的时间发生-事情是这样-每个部分的顺序不同,并非所有阶段都发生在所有部分。5 u) ]1 E& L: E8 M% b
我在数据库中拥有的只是每个阶段的开始日期,而不是结束日期。阶段的顺序几乎取决于开始日期的顺序。每个阶段至少每个阶段只能发生一次,因此是这样。如您所见,对于这种以性能为中心的程序而言,这是一件卑鄙的事情。
4 t$ Z+ g- G3 R  T: e2 {我相信它将涉及一个或多个临时数据库。我的想法:( c- ]  e7 \) s1 z% ]9 D* G) a
[ol]将所有日期汇总到新表的一行。由于阶段数设置,每个阶段都有相应的列-如有必要,什么时候开始,什么时候结束。现在需要通过每个循环,检查用户日期是否处于哪个阶段。所以: SectionID-phase1needed phase1start phase1end .....”* V+ U" G1 Q  \  Y
优点:
. P) G' W+ b1 q它可以手动确认数据并以辅助形式显示出来
( C4 h5 j" B  A3 N  C* ~+ @" C它使数据库保持较小+ S' M6 F. K+ w* }; z3 k
劣势:实际循环需要经历所有阶段(最坏的情况)才能找到正确的阶段。
3 n/ O0 G  p) m9 p7 X计算一个新的数据库,只是 IdSection-Date-Phase并在一个范围内计算每个节日和每天。- W5 z) d/ F! O0 ]2 k0 T
优势:这样,运行时间的计算就可以保持在每个部分进行查询
' s  _/ ^0 ?" i' \! |( |访问应处理大量数据- ]# y- U5 o: _& P" m0 M( R- @
缺点:我无法手动检查所有部分的操作是否正确
: y; c# f' u% g. C启动需要很长时间,就像真的需要很长时间一样" g, B# t! w( f. c1 b
这个数据库需要很多项目
[/ol]现在,我问你想用哪一种,或者有没有其他方法?我不能真正改变我的数据点。1 v. T2 l/ ^' H$ Y
简而言之,我必须显示不同阶段的时间间隔,在数据库中,我只有开始时间点,没有完整的阶段顺序。
3 M8 b- R4 ^4 V0 n4 B6 |谢谢你的想法。在这些方面的任何经验都会对你有所帮助. {! H* t; p! }& H$ `
                                                               
' U( f  s6 d! D7 v. d    解决方案:                                                                " k5 S& S  y/ H' X! D
                                                                如果我对你有正确的理解,你将获得一系列类似于以下形式的数据:( o' q. W. w/ b3 J3 Q
Section 1,Phase 7,Start Date = 11/07/2012Section 1,Phase 2,Start Date = 12/14/2012Section 1,Phase 3,Start Date = 12/28/2012Section 2,Phase 1,Start Date = 11/04/2012Section 2,Phase 9,Start Date = 12/30/2012Section 3,Phase 4,Start Date = 11/19/2012Section 3,Phase 5,Start Date = 12/06/2012Section 3,Phase 3,Start Date = 12/11/2012你想回答 2012年12月15日每个部分处于哪个阶段?等等,对吗?
* c& S2 O% `$ v# g答案应与以下形式相似:
5 q4 K9 ]7 I. V* |  M" K$ aSection 1,Phase 2Section 2,Phase 1Section 3,Phase 3为此,我假设你有个名字SECTION_PHASES表包含以下字段:3 k# n4 C: r( V4 i6 C
SECTION    NumberPHASE      NumberSTART_DATE Date/Time你需要做的是找出当前输入日期前每个部分的最大开始日期,因为这是下一阶段改变之前最近的活动阶段。完成此操作后,您可以将信息添加到主表中,以确定日期后的阶段。
2 d9 q: T, Y) V& h2 d您需要进行查询SECTION_MAX_DATES,然后在其SQL视图中有以下代码:
* T' G( F- r8 L# U$ s3 r+ v9 FSELECT [SECTION_PHASES].SECTION,Max([SECTION_PHASES].START_DATE) AS target_dateFROM SECTION_PHASESWHERE [SECTION_PHASES].START_DATE保存此查询后,您可以将其作为子查询添加到原始表中。现在,进行另一个查询SECTION_PHASE_AT_DATE,包括您的原始表和最后一个查询,然后在其中SQL在视图中输入以下代码:4 {9 [* |& d- {& t' Y0 f( G# f5 z
SELECT SECTION_PHASES.SECTION,SECTION_PHASES.PHASE,SECTION_PHASES.START_DATEFROM 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;如果我正确理解你的问题,查询将为你提供你所追求的结果。如果我能正确理解给定阶段的新开始日期指示新日期之前是当前任何阶段的结束,则无需计算结束日期。
. _5 @3 P, Z& E# B0 K  Q) U: p你仍然需要解决一些极端的情况,例如,如果某个节日在给定日期之前没有注册,会发生什么。我还将留给您了解如何在两个查询中首次查询WHERE考虑到已经取得的进步,参数日期可能对你来说微不足道!但是,我认为这是数据/计算部分,计算部分SQL结构。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则