【发布时间】:2019-05-13 04:19:59
【问题描述】:
我有一个表,其中包含大约 50 列的许多列,其中包含代表用户在执行过程时所采取的步骤的日期时间数据
SELECT UserID, Intro_Req_DateTime, Intro_Onset_DateTime, Intro_Comp_DateTime, Info_Req_DateTime, Info_Onset_DateTime, Info_Comp_DateTime,
Start_Req_DateTime, Start_Onset_DateTime, Start_Comp_DateTime,
Check_Req_DateTime, Check_Onset_DateTime, Check_Comp_DateTime,
Validate_Req_DateTime, Validate_Onset_DateTime, Validate_Comp_DateTime,
....
FROM MyTable
我想查找用户在某个日期时间之后执行的步骤
示例我想查找用户 ABC 他在 2019 年 5 月 2 日 17:25:36 之后所做的第一步
我不能用 case 来检查这需要很长时间来编码
有更简单的方法吗?
附:感谢大家建议重新设计数据库。不是所有的数据库都可以重新设计,这个数据库是我们拥有的大型系统之一,它已经使用了 20 多年。重新设计是不可能的。
【问题讨论】:
-
有 50 个
datetime列告诉我你的数据库设计是错误的。相反,您应该有一个表,其中可能包含 3 个datetime列(req、onset、comp),然后是一个类型。就目前而言,我认为您别无选择,只能在where子句中添加 50 个条件 - 仍然使用剪切和粘贴不会花费那么长时间。 -
或者可能编写一个包含 50 个案例语句的 View/ITVF,这样您只需要编写一次。
-
我可能有一个 Event 表,然后是一些标志或参考表来指定类型。重新考虑你的布局。
-
正如其他人所说,您将从重新设计数据架构中受益。一个最小的设计将有一个包含四列的表:ProcedureNumber、StepNumber、UserID、DateTime。使用跨越前三列的复合主键,并为第四列使用日期时间数据类型。
-
感谢大家建议重新设计数据库。不是所有的数据库都可以重新设计,这个数据库是我们拥有的大型系统之一,它已经使用了 20 多年。重新设计是不可能的。
标签: sql sql-server