【问题标题】:SSMS 2012: Convert DATETIME to Excel serial numberSSMS 2012:将 DATETIME 转换为 Excel 序列号
【发布时间】:2016-11-09 20:55:31
【问题描述】:

我似乎无法在任何地方找到答案 --- 我想将 SQL 中的日期时间转换为 excel 序列号。

我实际上是在寻找 Excel 中的 DATEVALUE 函数,但要在 SQL 中使用

关于如何做到这一点的任何想法?谢谢

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 date-manipulation


    【解决方案1】:

    假设所需日期是 2016-05-25

    Select DateDiff(DD,'1899-12-30','2016-05-25')
    

    返回

     42515
    

    如果你也想要时间部分

    Declare @Date datetime = '2016-05-25 20:00'
    Select DateDiff(DD,'1899-12-30',@Date)+(DateDiff(SS,cast(@Date as Date),@Date)/86400.0)
    

    返回

    42515.8333333
    

    【讨论】:

    • 我意识到这是一个旧帖子,我很抱歉恢复它,但这很奇怪。如果@Date 是“1900-01-01”,DateDiff 返回 2 而 Excel 返回 1。必须在某个时间点添加额外的一天。有谁知道那一天是什么日子,为什么?
    • @InterstellarProbe 只是生活中的那些小矛盾之一。 Excel 将 0 视为 1900-00-00,实际上是 1899-12-31,而 SQL Server 将第 0 天视为 1900-01-01 ... 只是为了好玩,试试 Select convert(datetime,0)
    • 我想通了。 Excel 将 1900 年视为闰年(因此 60 转换为 1900 年 2 月 29 日),但儒略历中不存在该日期。因此,对于 1/1/1900 和 2/28/1900(1 到 59)之间的日期,您需要使用 DateDiff(DD,'1899-12-31',@Date)。
    • 我发现这篇博文解释了它(如果你有兴趣的话):wambooli.com/blog/?p=3809
    • @InterstellarProbe 如果只有“普通人”知道我们每天必须与什么搏斗和关注什么,他们就会为我们建造纪念碑。 :)
    【解决方案2】:

    您只需将datetime 值转换为int 并添加1

    SELECT CONVERT(INT,YourDate) + 1
    FROM dbo.SomeTable;
    

    【讨论】:

    • 其实好像需要加+2才能匹配Excel返回的数字(?)如果不是这样的话,这个方法会比DateDiff()方法更优雅.
    【解决方案3】:

    使用排序规则:SQL_Latin1_General_CP1_CI_AS

    你应该使用

    Select DateDiff(DD,'18991230','20160525')
    

    返回 42515

    您可以将“20160525”替换为 getdate() 或您的日期字段

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 2010-10-18
      • 2017-04-12
      • 1970-01-01
      • 2021-08-31
      • 2016-09-08
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多