将时间戳添加到现有表

时间:2017-11-24 09:36:55

标签: sql sql-server

我有一个只有3列的SQL Server表,其中一列是varbinary类型。此列中的数据实际上是一个Json文档,其中包含有关上次修改数据的时间的信息。不幸的是,SQL表本身不包含有关何时修改其行的信息。

现在,在对数据进行排序和过滤时,我当然不想获取所有行以便查找例如最新的100个条目。

所以我的问题是:SQL Server是否记得何时添加/修改了一行?我已经尝试添加时间戳,这适用于所有现有的行,但我认为这是随机应用的,因为排序不起作用。我不需要日期时间或任何事情,我只想根据上次修改时间对记录进行排序。

由于

5 个答案:

答案 0 :(得分:0)

每次进行插入时,使用新列CreatedDate并存储日期时间。

您可以使用GetDate()在列中插入日期。

UpdatedDate列可用于更新。

答案 1 :(得分:0)

  

以便找到例如最新的100个条目。   时间戳确实是你需要的。

它的价值不断增加,它会自动更新,因此您始终可以找到所有上次修改/插入的行。

以下是一个例子:

create table dbo.test1 (id int);

insert into dbo.test1 values(1), (2), (3);

alter table dbo.test1 add ts timestamp;


update dbo.test1
set id = 10 
where id = 2

select  top 1 *
from dbo.test1
order by ts desc;

--id    ts
--10    0x000000001FCFABD2

insert into dbo.test1 (id)
values (100);

select  top 1 *
from dbo.test1
order by ts desc;

--id    ts
--100   0x000000001FCFABD3

如您所见,您始终会获得最后修改/插入的行。

出于您的目的,只需使用

select top 100 *
...
order by ts desc;

答案 2 :(得分:0)

感谢。显然我在发布这个问题之前看起来不够努力。这个问题之前已被问过几次,答案是:不!对此没有简单的解决方案。

SQL Server不会跟踪创建或修改记录的时间,这正是我所寻找的。所以我将寻找下一个最佳解决方案,可能是创建一个datetime列,从Json文档中检索修改日期,然后更新记录。或者更确切地说,有1,400万条记录: - (

答案 3 :(得分:0)

当插入或修改行时,SQL Server将无法跟踪历史记录,因此您需要依赖JSON数据来自行计算。您将需要一个新列来提高查询效率。获得新列后,您可以选择以下选项:

  1. 使用JSON数据中的相关值循环填充新列的所有记录。

  2. 如果您的SQL Server版本足够新,可以query the JSON data directly。使用如下查询填充此列:

    UPDATE MyTable
    SET MyNewColumn = JSON_VALUE(JsonDataColumn, '$.Customer.DateCreated')
    

    这种方法的缺点是你需要保持这个

  3. 让SQL Server自动计算JSON中的值,例如:

    ALTER TABLE MyTable
        ADD MyNewColumn AS JSON_VALUE(JsonDataColumn, '$.Customer.DateCreated')
    

    并创建一个索引以提高效率:

    CREATE INDEX IX_MyTable_MyNewColumn
    ON MyTable(MyNewColumn)  
    

答案 4 :(得分:0)

对于希望将DateTime类型的tamestamp列插入现有数据库表中的用户,您可以这样做:

(pointer, capacity, length)

现有记录将自动获得等于添加列时的日期/时间的值。 新记录将在插入时获得最新的值。