我们使用第三方产品来管理我们的体育中心会员资格.我们有几种会员类型(例如,初级,学生,员工,社区)和几种会员身份(例如,年度,活动,非活动,暂停).不幸的是,该产品仅记录会员当前的会员类型和状态.我希望能够跟踪我们的会员类型和状态随时间变化的方式.
目前,我们可以访问产品的数据库设计.它在SQL Server上运行,我们定期针对产品表运行自己的SQL查询,以生成我们自己的表.然后,我们将表格链接到Excel中的数据透视表以生成图表.所以我们熟悉数据库设计和SQL.但是,我们仍然坚持如何最好地解决这个问题.
该产品记录会员的会员购买情况以及他们的开始和到期日期.因此,我们可以回过头来确定会员在任何时间点的类型和状态.举例来说,如果他们买了在2007年1月1日,一个初级会员,并于2007年12月31日到期,那么他们买了2008年6月1日,一个学生会员,我们可以看到他们的状态,从主动去激活到激活(于扬分别于2008年1月和2008年6月1日),他们的类型从初中到学生(2008年6月1日).
基本上我们希望将成员的类型和状态属性转换为时间属性或有效性 a-la Fowler(或其他随时间变化的事物).
我们的问题(最后:) - 鉴于上述情况:您建议我们使用什么数据库表设计来保存此成员信息.我想它会有一个MemberID列,所以我们可以键入现有的Member表.它还需要存储成员的状态和类型以及他们所持有的日期范围.我们希望能够轻松地针对此表编写查询,以确定在给定时间点我们拥有的每种类型和状态的成员数量.
更新2009-08-25:已经进行了侧面跟踪,并且还没有机会尝试提出的解决方案.希望尽快这样做,并根据结果选择答案.
我有很多数据表,我想转换为Microsoft Temporal表,但是当我想转换时态表导致丢失我的数据.我的代码是:
Alter TABLE dbo.Employee
(
[EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED
, [Name] nvarchar(100) NOT NULL
, [Position] varchar(100) NOT NULL
, [Department] varchar(100) NOT NULL
, [Address] nvarchar(1024) NOT NULL
, [AnnualSalary] decimal (10,2) NOT NULL
, [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Run Code Online (Sandbox Code Playgroud)
如何通过保存数据将存在表改为Sql时态表?
sql sql-server temporal-database sql-server-2016 temporal-tables
有人知道SQL Server 的任何时间(http://en.wikipedia.org/wiki/Temporal_database)扩展吗?
我正在查看SQL Server 2016时态表,找不到任何有效的方法来查询现在删除的所有历史记录.
我不喜欢软删除或移动到'已删除的项目表',因为我觉得时态表是多余的.
这可以通过时态表以有效的方式实现吗?
我需要在下面的Temporal Table中为我的本地开发目的播种数据,开始日期应该是旧的.给定的表架构是
CREATE TABLE [dbo].[Contact](
[ContactID] [uniqueidentifier] NOT NULL,
[ContactNumber] [nvarchar](50) NOT NULL,
[SequenceID] [int] IDENTITY(1,1) NOT NULL,
[SysStartTime] [datetime2](0) GENERATED ALWAYS AS ROW START NOT NULL,
[SysEndTime] [datetime2](0) GENERATED ALWAYS AS ROW END NOT NULL,
CONSTRAINT [PK_Contact] PRIMARY KEY NONCLUSTERED
(
[ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[ContactHistory] , DATA_CONSISTENCY_CHECK …Run Code Online (Sandbox Code Playgroud) 您如何在SQL中表示时间多对多关系?在非时间环境下,人们会使用连接表(也就是链接/桥/地图)来连接双方.
添加时间跟踪就像在联结表上包含ValidStart和ValidEnd列一样简单吗?如果你这样做了,你遇到了什么问题(如果有的话)?在这种关系中,是否有更好的方法来跟踪随时间的变化?
如果它有帮助,在我的情况下,我专门使用SQL 2008,时间数据不是双时态的,因为我只跟踪有效时间.
sql database-design temporal-database temporal sql-server-2008
我的问题很简单:我有一个包含一系列状态和时间戳的表(为了好奇,这些状态表示警报级别),我想查询此表以获得两种状态之间的持续时间.
看起来很简单,但这里有一个棘手的部分:我不能创建查找表,程序,它应该尽可能快,因为这个表是一个拥有超过10亿条记录的小怪物(不开玩笑!)...
架构很简单:
[pk]时间价值
(实际上,还有第二个PK,但这对此无用)
在真实世界的例子之下:
Timestamp Status 2013-1-1 00:00:00 1 2013-1-1 00:00:05 2 2013-1-1 00:00:10 2 2013-1-1 00:00:15 2 2013-1-1 00:00:20 0 2013-1-1 00:00:25 1 2013-1-1 00:00:30 2 2013-1-1 00:00:35 2 2013-1-1 00:00:40 0
仅考虑2级警报的输出应如下所示,应报告2级警报的开始及其结束时(达到0时):
StartTime EndTime Interval 2013-1-1 00:00:05 2013-1-1 00:00:20 15 2013-1-1 00:00:30 2013-1-1 00:00:40 10
我一直在尝试各种各样的内部连接,但是所有这些都引导我进行了一次惊人的笛卡尔爆炸.你能帮助我找到一种方法来实现这个目标吗?
谢谢!
我目前有一个非时间MySQL数据库,需要将其更改为时态MySQL数据库.换句话说,为了报告目的,我需要能够保留随时间对记录所做的更改历史记录.
我实现这一点的第一个想法是简单地在表中插入而不是更新,当我需要选择数据时,只需GROUP BY在某个列上执行并按时间戳排序DESC.
但是,在仔细考虑了一下之后,我意识到这会让事情搞得一团糟,因为每个插入的主键(实际上只是模拟单个记录上的一些更新)会有所不同,从而搞乱任何联系使用主键链接到数据库中的其他记录.
因此,我的下一个想法是继续更新数据库中的主表,但也创建一个新的插入到"审计表"中,它只是更新后的完整记录的副本,然后当我需要报告时时态数据,我可以使用审计表进行查询.
有人可以给我一些指导或链接,如何正确地做到这一点?
谢谢.
我有一个带有时态表的SQL Server 2016数据库.一个时态表称为公司.我试图查询它以获取当前记录和所有历史记录.我首先尝试了以下查询:
select *
from Company c
FOR SYSTEM_TIME all
Run Code Online (Sandbox Code Playgroud)
并得到以下错误: 'FOR'附近的语法不正确.
但是,如果我在没有别名的情况下尝试它,它可以正常工作:
select *
from Company
FOR SYSTEM_TIME all
Run Code Online (Sandbox Code Playgroud)
我找不到任何关于此的文档 - 它是合法约束,已知问题还是其他什么?
考虑从当前数据库(仅存储在当前时间被认为是真实的事实)移动到时间数据库(可以支持处理涉及时间的数据).
我目前使用Entity Framework与数据库进行通信,但是将后续数据库作为后端继续使用Entity Framework是否容易?我没有从Web上找到很多针对此类数据库运行查询的示例.