2011-07-11 91 views
9

当使用datetime类型在sql server 2008中存储日期时间值时,它将以什么格式存储值?当在sql server(日期时间类型)中存储日期时间时,它以什么格式存储它?

它是自1970年以来的秒数(或其他)?

在应用程序端(.net),我传入一个日期时间对象。

当我在查询分析器中查看表格的行时,它会根据我的文化设置对其进行格式化还是我正在查看存储在数据库中的确切内容?

+0

不是一个答案,而是一般小费。以二进制格式进行投射将有助于诊断这种和其他人(unicode)的好奇心。选择cast(getdate()为二进制); –

回答

13

内部,根据SQLDenis,它们被存储为两个整数
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-server

当你在你看到的评估号码查询分析器查看。

这是存储为 “UNIX时间”
http://en.wikipedia.org/wiki/Unix_time

+0

+1我一直想知道他们是否是浮点数,指数用于什么,以及精度是否会进一步下降到未来:)感谢您解决这个问题。 – Andomar

+0

正确,很高兴我写的帖子可以帮助某人:-) – SQLMenace

+0

@SQLMenace当SO推介进来或刚刚读到这个问题时,你有没有通知? :D – Matthew

6

它存储为代表自1月1日天浮点,1900年如果你舍下来通过其铸造为int,即只留下日期部分:

select cast(cast(getdate() as int) as datetime) 
--> 
2011-07-12 00:00:00.000 

或者,如果你添加了一些对此,这是增加了几天。例如,添加0.5相当于添加12小时:

select getdate() + 0.5 
--> 
2011-07-12 11:22:09.927 

详见本MSDN article

日期时间不包含格式信息;查询分析器可以以任何喜欢的方式显示它。它可能会尝试尊重您的客户端PC的区域设置。

+2

+1它们可能会被当作浮点数并在SQL中操作,就像它们是一样的,但是当它们写入磁盘时,它们是整数。 – Matthew

+0

他们存储为2整数,看到我的帖子在这里http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-server – SQLMenace

-1
DateTime doj = new DateTime(); 

System.Globalization.CultureInfo c1=new System.Globalization.CultureInfo("en-GB",true); 
doj = DateTime.Parse(Txtdoj.Text.Trim(), c1, System.Globalization.DateTimeStyles.NoCurrentDateDefault); 

使用 ..它

使用查询,显示日期时间 选择转换(varchar(max), doj,103)as doj from tbl_registration

-1

以下是查看存储方式的代码:

DECLARE @now datetime, @bytenow binary(8) 
SELECT @now = getdate() 
SELECT @bytenow = convert(binary(8), @now) 
SELECT @now AS fulldate, @bytenow AS internal, 
     convert(int, substring(@bytenow, 1, 4)) AS days, 
     convert(int, substring(@bytenow, 5, 8)) AS ticks 

这显示了2个值:

  1. 前4个字节是1900年1月1日以来
  2. 第二4个字节表示天数的数目,因为午夜其中一个滴答声数目秒钟有300个滴答声。

fulldate    internal   days  ticks 
----------------------- ------------------ ----------- ----------- 
2016-11-07 10:54:13.080 0x0000A6B700B3AFB4 42679  11775924 

参考:Solving the Datetime Mystery看到图3

+0

那为什么要投票呢? –