我有一个我想要存储在数据库中的书籍列表。其中一个属性是该书首次发布的日期。旧书(超过100年)我经常只知道十年(如185X)或者非常旧的书籍只是一个世纪(如15XX)。
如何在datetime2字段中保存这些日期? 15XX为1500?例如,我希望能够查询超过一百年的书籍。所以我想以某种方式将这些值存储为有效的datetime2值。任何建议? 15XX作为'1500-01-01 00:00'对我来说似乎是合理的。这种方法的任何缺点?
答案 0 :(得分:4)
唯一的缺点是当有人要求出版从1550年到1650年出版的所有书籍时。你的15XX变为1500,所以它不会包括在他的结果中。
当你的书出版时,你真正拥有的是一段不确定的时期。我会存储2个日期:一个在期间开始时,另一个在结束时。现代书籍将其设置为相同日期,但最旧的书籍可以存储为1500-01-01 00:00 - 1599-12-31 23:59
当然会使选择变得复杂。你必须决定它是否值得。你可以声明要求“1550到1650”是非常愚蠢的。
答案 1 :(得分:3)
在扩展到@ dragon112的答案时,是否有可能需要15XX
作为前两个选项的两个选项? (与NULL一样,同时也不是任何值。)
如果是这样,您可以存储两个日期并制作出版图书的日期范围。
这确实会使您的查询/系统更加复杂。编写这些语法的SQL机器人在语法上是正确的,但你需要在任何给定的情况下选择适当的,因为它们可以给出不同的结果......
WHERE
earliestPublishDate > '1550-01-01'
WHERE
latestPublishDate > '1550-01-01'
因此,确定如何存储数据时最重要的问题是: - 你打算怎么审问它?
您需要了解您的用例(或可能的用例)才能确定正确的数据表示。
答案 2 :(得分:1)
在我看来,有3种方法可以保存这类书的日期:
这些方法与代码本身无关,但是当您查询特定年龄时,它们会影响您的结果。所以,在我看来,对你来说最好的事情应该没问题。
换句话说,当你查询一本500岁的书时,你想获得一本15xx以上的书吗?由于现在是2012年,该书将不会被数据库退回(2012 - 500 = 1512)。
答案 3 :(得分:1)
有趣的问题,我会考虑以下解决方案:
将值保存为数据库中的两个字段。 第一个以您提到的'1500-01-01 00:00'格式存储,以便进行排序。第二个字段用于记录原始值15XX,其数据类型为字母数字类型。
通过这种方法,您不会失去数据未知的事实。但是你仍然可以满足你搜索超过特定日期的书籍的要求。
然后严格按照字母数字字段计算日期时间字段。
答案 4 :(得分:1)
如果您不需要使用日期存储时间,则使用数据类型“日期”,不需要使用datetime2来仅允许01-01-0001的日期。
日期也支持从0001-01-01到9999-12-31的日期。 Datetime2的时间准确度高于datetime。
答案 5 :(得分:0)
DECLARE @var VARCHAR(100)
SET @var = ''
SET @var = CASE LEN(@var)
WHEN 1 THEN @var + '000'
WHEN 2 THEN @var + '00'
WHEN 3 THEN @var + '0'
ELSE @var
END
SELECT CAST(@var AS DATE)