只知道十年/世纪的sql存储日期

时间:2012-04-26 10:08:26

标签: sql date

我有一个我想要存储在数据库中的书籍列表。其中一个属性是该书首次发布的日期。旧书(超过100年)我经常只知道十年(如185X)或者非常旧的书籍只是一个世纪(如15XX)。

如何在datetime2字段中保存这些日期? 15XX为1500?例如,我希望能够查询超过一百年的书籍。所以我想以某种方式将这些值存储为有效的datetime2值。任何建议? 15XX作为'1500-01-01 00:00'对我来说似乎是合理的。这种方法的任何缺点?

6 个答案:

答案 0 :(得分:4)

唯一的缺点是当有人要求出版从1550年到1650年出版的所有书籍时。你的15XX变为1500,所以它不会包括在他的结果中。

当你的书出版时,你真正拥有的是一段不确定的时期。我会存储2个日期:一个在期间开始时,另一个在结束时。现代书籍将其设置为相同日期,但最旧的书籍可以存储为1500-01-01 00:00 - 1599-12-31 23:59

当然会使选择变得复杂。你必须决定它是否值得。你可以声明要求“1550到1650”是非常愚蠢的。

答案 1 :(得分:3)

在扩展到@ dragon112的答案时,是否有可能需要15XX作为前两个选项的两个选项? (与NULL一样,同时也不是任何值。)

  • 该书的最早可能日期(对于15xx,它将是1500)
  • 该书最年轻的日期(15xx为1599)

如果是这样,您可以存储两个日期并制作出版图书的日期范围。

这确实会使您的查询/系统更加复杂。编写这些语法的SQL机器人在语法上是正确的,但你需要在任何给定的情况下选择适当的,因为它们可以给出不同的结果......

WHERE
  earliestPublishDate > '1550-01-01'

WHERE
  latestPublishDate > '1550-01-01'


因此,确定如何存储数据时最重要的问题是: - 你打算怎么审问它?

您需要了解您的用例(或可能的用例)才能确定正确的数据表示。

答案 2 :(得分:1)

在我看来,有3种方法可以保存这类书的日期:

  • 该书的最早可能日期(对于15xx,它将是1500)
  • 该书最年轻的日期(15xx为1599)
  • 上面的一半(15xx它将是1550)

这些方法与代码本身无关,但是当您查询特定年龄时,它们会影响您的结果。所以,在我看来,对你来说最好的事情应该没问题。

换句话说,当你查询一本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)