【问题标题】:Convert long java datetime to SQL Server datetime将长 java 日期时间转换为 SQL Server 日期时间
【发布时间】:2020-01-20 16:44:06
【问题描述】:

我有1579537505834 long ,代表2020-01-20 17:25:05.833 的日期和时间。

我尝试将其转换为 SQL Server 的 datetime 值:

select 
    convert(datetime, (((1579537505834) / (1000.0 * 60.0 * 60.0 * 24.0)) +  25567))

但结果是:2020-01-20 16:25:05.833: 1 小时的错误。

谢谢

编辑:问题是 +1 时区!我该怎么办?

EDIT2:使用 PostgreSQL,我没有这个问题

SELECT to_timestamp (1579537505834 / 1000)

编辑3: 解决办法

select convert(datetime,(((cast(1579537505834 as bigint)) / (1000.0 * 60.0 * 60.0 * 24.0)) + 25567 ))+cast(DateDiff(Hour, GetUTCDate(), GetDate()) as numeric(35,15))/24

工作!谢谢大家!

【问题讨论】:

  • 在线转换器也将此数字转换为 16:25。你确定现在是 17:25?
  • 是的,够了,但我又做了一些测试.. sqlserver中的转换功能看起来对吗?
  • 问题是添加时区:GMT:2020 年 1 月 20 日星期一 16:25:05.834 您的时区:lunedì 20 gennaio 2020 17:25:05.834 GMT+01:00
  • 夏令时和/或时区是否会导致此问题?
  • 我不知道这是否有帮助,但您可以通过以下方式获取时区偏移量:Select DateDiff(Hour, GetUTCDate(), GetDate())

标签: sql-server datetime


【解决方案1】:

AT TIMEZONE 可以切换 TIMEZONE(这是 ISO SQL 标准操作符):

SELECT CONVERT(datetime, (((1579537505834) / (1000.0 * 60.0 * 60.0 * 24.0)) +  25567)) AT TIME ZONE 'GREENWICH STANDARD TIME' AT TIME ZONE  'CENTRAL EUROPEAN STANDARD TIME'

【讨论】:

    【解决方案2】:

    我认为另一种计算新日期的方法会更快,但毫秒是:

    SELECT DATEADD(s, 1579537505834.0 / 1000, '1970-01-01')
    

    可以替换

    CONVERT(datetime, (((1579537505834) / (1000.0 * 60.0 * 60.0 * 24.0)) +  25567))
    

    【讨论】:

    • 我尝试 (SELECT DATEADD(s, 1579594224900 / 1000, '1970-01-01')) 日期是 2020-01-21 09:10:24.000,但结果是 2020-01 -21 08:10:24.000
    • 请查看 EDIT3。非常感谢!
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2014-09-05
    • 2019-03-07
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多