【问题标题】:When storing a datetime in sql server (datetime type), what format does it store it in?在sql server(datetime类型)中存储日期时间时,它以什么格式存储?
【发布时间】:2011-07-11 21:14:55
【问题描述】:

在sql server 2008中存储一个datetime值时,使用datetime类型,会以什么格式存储该值?

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

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

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

【问题讨论】:

  • 不是答案,而是一般提示。转换为二进制文件将有助于诊断像这样和其他(unicode)这样的好奇心。 select cast(getdate() as binary);

标签: sql-server datetime


【解决方案1】:

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

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

它不存储为“unix 时间”
http://en.wikipedia.org/wiki/Unix_time

【讨论】:

  • +1 我一直想知道它们是否是浮点数,指数的用途,以及未来精度是否会进一步降低 :) 感谢您澄清这一点。
  • 正确,很高兴我写的帖子可以帮助到某人:-)
  • @SQLMenace 当 SO 推荐进来时您是否收到通知,或者您是否碰巧阅读了这个问题? :D
  • 我偶然在推荐人中看到它:-)
  • @Matthew 你是什么意思我看到了评估数字?
【解决方案2】:

它存储为表示自 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 的区域设置。

【讨论】:

【解决方案3】:

查看存储方式的代码如下:

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

【讨论】:

  • 为什么投反对票?我喜欢改进,但我需要知道你认为这个答案的哪一部分是不正确的。
【解决方案4】:
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);

使用 ..它

使用查询显示日期时间 从 tbl_registration 中选择 convert (varchar(max),doj,103)as doj

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多