将日期存储为整数(数字),有什么好处

Jac*_*all 11 sql-server-2008 sql-server date-format

问题 1

我正在使用一个系统,其中日期存储为整数(实际数字(8,0)),我注意到其他系统也将日期存储为 int ,例如在此线程中的 cisco。例子

20120101  -- 01 Jan 2012
Run Code Online (Sandbox Code Playgroud)

保持数字日期系统而不使用 SQL 日期时间有什么好处吗?

问题2

现在我正在尝试遍历数字日期以查找两个日期之间的客户。如果startenddate包含两个月,我会得到数千条记录,而不仅仅是 60 条记录。例如:

create table #temp1(day int,capacity int) /* just a temp table */

declare @start int 
declare @end int

set @start=20111201
set @end = 20120131

while (@start <= @end) 
Begin
    insert into #temp1  /* I am storing things in #temp table so data looks pretty */
    exec usp_GetDailyCap @date1= @start

    set @start = @start + 1;    
end

select * from #temp1
Run Code Online (Sandbox Code Playgroud)

这会提取 8931 条记录而不是 60 条记录。有没有更好的方法来改进上述逻辑,以便我只提取有效日期?我尝试了 IsDate 和子查询,但这并不能有效地工作。

Tho*_*ger 11

要回答您的第一个问题,我建议使用DATETIMESQL Server 中的数据类型。不一定是出于性能原因,而是为了利用 RDBMS 特定的功能。例如,你将不得不重新发明了很多的逻辑只是做基本的数学日期(想想DATEDIFF()DATEADD()DATEPART()和许多其他功能。他们显然是量身定做的DATETIME数据类型,很容易与工作)。

至于你的第二个问题,你遇到了第一个问题(和我的答案)针对的确切问题将 20111201 和 20120131 视为日期,您的大脑告诉您应该相差 60 天。好吧,您正在根据 delta 进行循环……即:

20120131 - 20111201 = 8930 (使用包含循环,它将是 8931)

换句话说,您的WHILE循环执行了 8931 次。发生这种情况是因为这些是整数值,您的循环不会从 20111231 直接跳转到 20120101。

您的整数不会考虑年和月的上限(即您的问题 2问题)。

  • 除了性能和功能,还有完整性。使用整数作为日期,数据库将允许“20121301”和“20120230”甚至“20129999”作为日期。 (4认同)
  • 有许多(如果不是大多数)专业设计的数据库使用了糟糕的技术。我使用过许多 COTS 产品,但没有看到任何从数据库角度精心设计的产品。 (4认同)
  • @Jackofall:将日期存储为整数(并有间隙)与将日期时间/时间戳存储为整数 - 甚至将日期存储为整数之间存在很大差异,就像 VB/Excel 那样。 (3认同)

A-K*_*A-K 6

  1. Ralph Kimball 建议将日期存储为整数。他写了很多,包括在线文章和书籍。
  2. 您可以使用日历表并为您的日期发出连续数字,如下所示:

    日期编号

    20120229 1234

    20120301 1235

必须生成日历表,但这是一项非常简单的任务。

  • 他的理由是什么? (3认同)

DFo*_*k42 5

潜在的数据类型及其大小/限制:

  • 十进制(8,0):5 个字节
  • 日期:3 个字节,0001-01-01 到 9999-12-31
  • 整数:4 字节

数字数据类型的优点:

  • 他们看起来漂亮吗?

数字数据类型的缺点:

  • 需要自定义代码来处理日期操作
  • 需要自定义代码来管理正确的日期(即不允许 20120230 [2012 年 2 月 30 日])
  • 与 Date 数据类型相比,数据占用空间更大。

老实说,您最好使用日期数据类型恕我直言。