在SQL Server 2008中,如果我不希望它为null,我应该使用什么默认日期?

时间:2009-10-07 16:29:44

标签: c# sql-server ado.net

我有一些日期类型的列,我用于创建,最后修改等等。

我不希望这些列允许空值,对于我们应该用于未使用的初始化状态的最佳实践是什么?

e.g。我应该使用datetime.minvalue的任何值吗?

11 个答案:

答案 0 :(得分:10)

你应该使用NULL - 这就是它的用途;未知或未初始化的值。

如评论中所述,没有必要使DateCreated可以为空。有些人甚至争辩说,良好且高度规范化的数据库设计根本不应允许空值 - 例如参见article - 我倾向于同意。

答案 1 :(得分:5)

我喜欢在这种情况下为列设置默认值getDate()或getUTCDate()。

例如,CreatedDate不应该为NULL,否则记录理论上应该首先不存在?

随后如果存在记录,那么它已经被创建,因此也被修改,因此修改后的日期也可以具有默认值getDate()。

这也是通常用于跟踪数据仓库中记录/行更改的方法。

答案 2 :(得分:2)

最佳做法是在要存储未使用的日期时使用NULL。当你读出它时,你可以检查NULL并使用DateTime.MinValue,如果你想要的话。

答案 3 :(得分:2)

  

我不希望这些列允许空值,对于我们应该用于未使用的初始化状态的最佳实践是什么?

由于您不想使用null,因此可以使用1753年1月1日0:00:00。这是SQL Server中datetime的最小可能值,不太可能是数据集中的实际值。

但实际上,如果可以的话,你应该使用null

答案 4 :(得分:1)

DateTime.MinValue不适合日期时间数据类型。您可以使用datetime2数据类型,但与其他建议的一样,您应该使用NULL。

我经常创建一个像LastModified或LastLogin这样的列,它默认为null。

快速看到空通知我,用户从未修改过数据或登录过系统。在这种情况下,NULL值确实意味着什么。

答案 5 :(得分:1)

如果您的列确实是CreatedLastModified,那么为什么不使用GetDate()(或更好,GetUtcDate())初始化它们?这就是文件系统初始化新创建文件的日期时间戳的方式。

但是,正如其他人所指出的那样,没有理由害怕null。如果你的意思是“没有适用的价值”,那么null似乎是表达这一点的完美方式。

答案 6 :(得分:1)

未使用的未初始化状态正是NULL旨在表示的。你应该在适当的地方允许NULL(例如,如果某些东西没有被终止,则在TERMINATIONDATE列中),并使用NULL不合适的值(比如添加行时为DATECREATED)。

对NULL日期使用废话值会让用户感到困惑。 “如何终止日期是在2099年?我们还不是在2099年!”或“如何终止日期是在1732年?我们当时不存在!”

未初始化意味着 - 未初始化。它并不意味着“初始化,但具有虚假价值”。

答案 7 :(得分:1)

我完全同意NULL/GETDATE()个答案。

作为一般的最佳实践,我会避免在任何地方存储特殊的日期时间值,除非您准备定期包装它们。因为当DATEDIFF开始出现数千个月差异等时,您最终必须修复逻辑以添加阈值。

我使用日期的规则绝不是特殊的日期时间值和NOT NULL(通过约束/表定义),除非有特殊保留日期值的需要,然后我尝试使用NULL。如果我需要多个保留日期,我会查看日期时间为NULL的单个标记列,或者加入日期维度而不是日期时间列(特别是在仓库中)。

对于DateCreatedDateModified的情况,我使用列默认值初始化为GETDATE()DateModified通常会在UPDATE触发器中刷新。

答案 8 :(得分:1)

除了输入记录的日期之外,我不会设置默认日期(只有在date_created字段中这样做才有意义)。例如,如果您使用的数据不太可能在其他数据中使用,那么首先它是不正确的数据,并且有一天会回来困扰您。有些人不知道你做了这么愚蠢的事情,总有一天会找不完整的记录,当然也找不到,因为有一个约会。或者假设您想要一个cetain开始日期和结束日期之间的记录,并记录过程开始但未结束的记录。使用假日期在内部查询比使用null更难。假设您想要比设定日期更早的记录,那么您必须记住要排除这些记录,否则它们将显示在您的记录集中,如果您想要使用像3000/01/01这样的日期的后续记录,则相同。因此,处理null可能只是在查询数据库的过程中,只有你远远不太可能这样做。因此,对于以日期为中心的查询,您会更频繁地得到错误的结果。

Null正是针对这些情况,您不知道数据输入时的值应该是什么。永远不要假装数据以避免使用null。这是一种非常糟糕的做法。

答案 9 :(得分:1)

如果最佳实践确实是您所追求的,请使用NULL ...讨论结束。任何其他选择都是我们所说的不那么好的做法。像往常一样,有很多不太好的做法可供选择。这里提到了很多!

答案 10 :(得分:0)

Null对索引或查询(如之间)不一定有效。我倾向于在可比的日期使用01/01/0001或12/31/9999。 (DATETIME2)