【问题标题】:SQL Server - store datetime and decimalSQL Server - 存储日期时间和十进制
【发布时间】:2015-05-25 15:23:30
【问题描述】:

我正在开发一个更改历史记录表,我将在其中记录两种类型字段更改的旧值和新值:十进制和日期时间。

为了简单起见,我正在考虑创建一个字符串字段并将值转换为字符串,然后再存储到表中。 我的问题是,稍后我将不得不在报告中创建一个字段以显示更改之间的差异(例如,如果日期从 01/20/2015 更改为 01/27/2015,则差异将为 7 等等)。我不想在表中创建一个字段来记录字段之间的差异,我想在报表端做。

我的问题是: 有没有办法存储这两种数据(十进制和日期时间),以便以后进行比较变得简单?因为如果我将其转换为字符串类型,我将不得不对其进行两次转换 - 一次在 DB 中创建记录之前,另一次查看它们之间的区别。

【问题讨论】:

  • 您可以轻松地在尾部使用CAST(stringfield AS DATE),但我不明白您为什么不想使用DATE 字段。
  • 为什么不在历史中存储这些列的真实类型呢??
  • 如果您要存储日期,请使用适当的数据类型,它是DATEDATETIME,它将允许您使用内置的 DATETIME 函数,让您的生活更轻松。您已经做出了不错的选择,即不存储值之间的差异,这是您应该在运行时执行的操作。
  • 将它存储在日期时间字段中的问题是因为我也有十进制字段要存储。我将为每个字段更改创建一条新记录,因此如果有人同时更改价格和日期,它将在我的表中创建两条记录。如果我创建一个日期时间字段,我还必须创建十进制字段,并且将有 2 个字段我不会在我的记录中使用 - 如果我存储十进制,我将不使用日期时间字段,如果我存储日期时间我'不会使用小数点。
  • 这不会节省你的时间,以后会成为你的痛苦

标签: sql sql-server datetime decimal


【解决方案1】:

我相信最好的方法是我喜欢称之为永不删除、永不更新的方法
基本上,您在源表中添加一列用于记录状态,可以是 currenthistoricdeleted(为此使用 tinyint,只需确保将其链接到行状态表可读性)。然后不是删除一条记录,而是将其状态更新为已删除,而不是更新它,而是将其状态更改为历史记录,然后使用新数据插入一条新记录。

当然,这种方法是有代价的,因为您必须编写一个而不是更新触发器,但与其他保留历史数据的方法相比,这是一个很小的代价。
此外,如果您的主键不是 identity 列,则需要将此列添加到您的主键(以及您可能拥有的任何其他唯一约束)。
您可能还想为非聚集索引添加一个过滤器,以便它们只索引状态为当前的记录。

【讨论】:

  • 嗨 Zohar,我喜欢你的想法。在这种情况下,我将不得不更改程序的行为(更改逻辑以创建新记录而不是更新当前记录)还是您认为我可以仅在 DB 大小中做到这一点(创建触发器以创建新记录更新时记录并取消更新本身)。最好的方法是什么?
  • 安全的方法是创建一个instead of update 触发器。这样可以确保即使直接从 SSMS 处理记录,它仍然不会被更新(状态列除外)并且会插入新记录。
  • 我的老板不喜欢标识列的想法,因为在 ERP 方面进行了必要的更改 - 仅显示当前记录。但是,您让我想到了我的想法所带来的痛苦,因此我将您的答案投票为正确的答案。谢谢(:Ps.:我将创建一个包含两个字段的镜像表。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2018-09-20
  • 1970-01-01
  • 2010-10-23
  • 2021-01-04
相关资源
最近更新 更多