在sql server(datetime类型)中存储日期时间时,它以什么格式存储它?

时间:2011-07-11 21:14:55

标签: sql-server datetime

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

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

在应用程序端(.net),我传入的是datetime对象。

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

4 个答案:

答案 0 :(得分:13)

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

在查询分析器中查看它们时,您会看到已评估的数字。

存储为“unix time”
http://en.wikipedia.org/wiki/Unix_time

答案 1 :(得分:6)

它存储为表示自1900年1月1日以来的天数的浮点数。如果通过将其转换为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)

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)作为doj从tbl_registration

答案 3 :(得分:-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个字节是表示自1-1-1900以来的天数的数字
  2. 第二个4个字节是从午夜开始的刻度数,其中一秒钟有300个刻度。
  3. fulldate                internal           days        ticks
    ----------------------- ------------------ ----------- -----------
    2016-11-07 10:54:13.080 0x0000A6B700B3AFB4 42679       11775924
    

    参考:Solving the Datetime Mystery参见图3