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


11

问题1

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

20120101  -- 01 Jan 2012

保留数字日期系统而不使用SQL Datetime有什么好处?

问题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

这将提取8931条记录而不是60条记录。是否有更好的方法来改进上述逻辑,所以我仅提取有效日期?我尝试了IsDate和子查询,但是这种方法无法有效地工作。


如果您运行的是SQL Server 2008或更高版本,则实际上可以仅使用数据类型Date。它稍微小一点,不会强迫您包括时间,但是几乎所有SQL的datetime函数仍然可以使用它。
DForck42 2012年

2
我只看到这种方法的缺点,没有任何好处
a_horse_with_no_name2012年

Answers:


11

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

至于第二个问题, 您正在碰到第一个问题(和我的答案)所针对的确切问题将20111201和20120131视为日期,而大脑告诉您应该相差60天。好吧,您正在基于增量循环遍历...这是:

20120131 - 20111201 = 8930 (包含包容性循环将为8931)

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

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


那正是我的问题。对于数字日期,循环可能会成千上万,而不仅仅是30天或29天。但是请记住,我正在使用专业系统。甚至cisco都使用它。
Jackofall 2012年

4
除了性能和功能之外,还具有完整性。用整数日期,该数据库将允许2012130120120230甚至20129999作为一个日期。
ypercubeᵀᴹ

@Jackofall思科在其背后没有RDBMS平台。他们写了自己的逻辑。为什么不会,他们只是使用整数。从头开始,这可能是低级软件最简单的方法。但是我们在这里谈论的是苹果和橙子。
Thomas Stringer 2012年

3
@Jackofall:将日期存储为整数(并带有间隔)与将日期时间/时间戳存储为整数-甚至将日期存储为整数(与VB / Excel一样)之间有很大的区别。
ypercubeᵀᴹ

4
有许多(如果不是大多数的话)使用不良技术的专业设计的数据库。我曾经使用过许多COTS产品,但是从数据库的角度来看,它们并没有被很好地理解。
HLGEM 2012年

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

    日期编号

    20120229 1234

    20120301 1235

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


1
我想看到这样一种情况,您可以通过加入一个日期表并将日期存储为数字来过滤查询,然后使用“ @startdate和@enddate之间的[date]之间的位置”来过滤这些数字日期
DForck42

1
@ DForck42,您无需建议这种情况:“其中[dateAsInt]在20120229和20120329之间”将返回与“在[date]在'20120229'和'20120329'之间的位置”完全相同的行”
AK

3
他的理由是什么?
HLGEM 2012年

5

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

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

数字数据类型的优点:

  • 看起来漂亮吗?

数字数据类型的缺点:

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

老实说,最好使用日期数据类型IMHO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.