[英]Slowly changing dimension by date only
我有一个数据库表,它使用尺寸变化缓慢的数据仓库的概念来跟踪旧版本。 因此,我使用日志触发机制实现了它。
我的桌子是这样的:
CREATE TABLE "T_MyTable" (
"Id" INT NOT NULL DEFAULT NULL,
"Description" NVARCHAR(255) NULL DEFAULT NULL )
我创建了一个hystory表
CREATE TABLE "T_MyTableHistory" (
"Id" INT NOT NULL DEFAULT NULL,
"Description" NVARCHAR(255) NULL DEFAULT NULL,
StartDate DATETIME,
EndDate DATETIME )
然后,使用这样的触发器,我得到了历史记录:
CREATE TRIGGER TableTrigger ON T_MyTable FOR DELETE, INSERT, UPDATE AS
DECLARE @NOW DATETIME
SET @NOW = CURRENT_TIMESTAMP
UPDATE T_MyTableHistory
SET EndDate = @now
FROM T_MyTableHistory, DELETED
WHERE T_MyTableHistory.Id = DELETED.Id
AND T_MyTableHistory.EndDate IS NULL
INSERT INTO T_MyTableHistory (Id, Description, StartDate, EndDate)
SELECT Id, Description, @NOW, NULL
FROM INSERTED
而且,要查询历史记录表,我使用
SELECT Id, Description
FROM T_MyTableHistory
WHERE @DATE >= StartDate
AND (@DATE < EndDate OR EndDate IS NULL)
现在,我的问题是:我的客户实际上只会按日期查询历史记录表(即没有一天中的时间),因此我需要获取该日期的记录版本。 我考虑了两个选择:
更改触发器(如何?)以每个日期仅记录一个“历史”记录。
保持触发器不变,记录数据库中的所有更改(包括日期和时间),然后查询历史记录表以获取特定日期的最新版本(如何?)
我的感觉是第二个选项更易于实现,否则触发器可能会变得复杂(INSERT或UPDATE,取决于当前日期的历史记录的存在)。
在选择正确的方向时,我需要一些帮助,并且希望在所选选项中有一个所需SQL查询的示例。
我同意你的第二意见 。 最好将日期和时间一起保存。 在基于日期过滤数据时,请使用CONVERT()
函数以确保仅比较DATE。 另外,当客户输入单个日期时,如果记录的开始日期和结束日期相同,则它们将不在您的过滤器中,因此请使用Date> = StartDate和Date <= EndDate not(> =,<)
DECLARE @Date AS DATETIME
SET @Date = '2013-07-30'
SELECT TOP 1 Id, Description
FROM T_MyTableHistory
WHERE CONVERT(VARCHAR(20), @DATE, 103)
>= CONVERT(VARCHAR(20), StartDate, 103)
AND (CONVERT(VARCHAR(20), @DATE, 103)
< CONVERT(VARCHAR(20), EndDate, 103) OR EndDate IS NULL)
ORDER BY StartDate DESC
最后,我想到了以下查询:
SELECT Id, Description
FROM T_MyTableHistory
WHERE ( DateAdd(day, datediff(day,0, @MyDate), 0) >= StartDate ) AND
(( DateAdd(day, datediff(day,0, @MyDate), 0) < EndDate ) OR ( EndDate IS NULL ))
这应该比varchar <-> datetime转换要快,并且还应该与语言环境无关。 顺便说一句,该查询不需要TOP 1
和ORDER BY
子句,因为该函数
DateAdd(day, datediff(day,0, @MyDate)
自动返回选定的日期,并带有“午夜”时间(例如20141215 00:00:00),因此具有相同日期的记录会自动从结果中删除。
参考文献:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.