SQL Server 和 Java 之间的时间戳差异

2024-02-15

我需要将一个简单的过程从 Java 代码复制到 SQL Server 存储过程。它将进入生产中的 SQL Azure 数据库,但我正在针对本地 SQL Express 12 安装对其进行测试。

该存储过程的一部分是将一些值连接成一个字符串。

这是我的 Java 代码示例:

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import com.google.common.base.Strings;

public static String concat() {
  //init variables with sample data
  DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS");
  Timestamp date = new Timestamp(dateFormat.parse("04/04/2014 21:07:13.897").getTime());

  //format variables into 0-filled strings
  String formattedDate = String.format("%011d", date.getTime() / 1000);

  //concat those strings
  String finalString = ... + formattedDate + ...;
  return finalString;    
}

变量:

| date                    | formatted_date |
| ----------------------- | -------------- |
| 2014-04-04 21:07:13.897 | 01396638433    |

这在 SQL 中是等价的:

DECLARE @date DATETIME;
DECLARE @formatted_date CHAR(11);
DECLARE @final_string CHAR(22);

--init variables with same data as Java code
SET @date = '2014/04/04 21:07:13.897';

--format variables into 0-filled strings
SET @formatted_date = FORMAT(DATEDIFF(s,'1970-01-01 00:00:00', @date), '00000000000');

--concat those strings
SET @final_string = CONCAT(..., @formatted_date, ...);

变量:

| date                    | formatted_date |
| ----------------------- | -------------- |
| 2014-04-04 21:07:13.897 | 01396645633    |

在检查输出是否相同时,我注意到日期不同:

Java output:  01396638433
MSSQL output: 01396645633

我打开了这个网站 http://www.epochconverter.com/看看这个差异意味着什么:

Java:  GMT: Fri, 04 Apr 2014 19:07:13 GMT, Your time zone: 4/4/2014 21:07:13 GMT+2
MSSQL: GMT: Fri, 04 Apr 2014 21:07:13 GMT, Your time zone: 4/4/2014 23:07:13 GMT+2

整整两个小时的时差。

我找到了一个针对 SQL Server 运行的查询来检查时区设置:

DECLARE @TZ SMALLINT
SELECT @TZ=DATEPART(TZ, SYSDATETIMEOFFSET())

DECLARE @TimeZone VARCHAR(50)
EXEC MASTER.dbo.xp_regread 'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\TimeZoneInformation',
'TimeZoneKeyName',@TimeZone OUT

SELECT @TimeZone, CAST(@TZ/60 AS VARCHAR(5))+':'+Cast(ABS(@TZ)%60 AS VARCHAR(5));

Output:

| Time zone               | Offset  |
| ----------------------- | ------- |
| W. Europe Standard Time | 2:0     |

我检查了 JVM 时区,如下所示:

Calendar now = Calendar.getInstance();
System.out.println(now.getTimeZone());
System.out.println(System.getProperties().get("user.timezone").toString());

Output:

sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000, dstSavings=3600000,
transitions=143, lastRule=java.util.SimpleTimeZone[id=Europe/Berlin, offset=3600000, 
dstSavings=3600000, startYear=0, startMode=2, startMonth=2, startDay=-1,
startDayOfWeek=1, startTime=3600000, startTimeMode=2, endMode=2, endMonth=9,
endDay=-1, endDayOfWeek=1, endTime=3600000, endTimeMode=2]]
Europe/Berlin

如何在 Java 和 SQL Server 之间获得相同的时间戳?


在 SQL Server 方面——

SQL Server中有一个函数叫做getutcdate()返回当前 UTC 时间。将此与比较getdate()您可以获取 UTC 的时差并修改该值的格式。

select datediff(s, getutcdate(), getdate())

无论如何都比访问注册表更好。

因此,SQL Server 代码应如下所示:

DECLARE @date DATETIME;
DECLARE @formatted_date CHAR(11);
DECLARE @final_string CHAR(22);
DECLARE @diff_sec int;

--init variables with same data as Java code
SET @date = '2014/04/04 21:07:13.897';

--get the difference between UTC and local in seconds
SET @diff_sec = datediff(s, getutcdate(), getdate());

--format variables into 0-filled strings
SET @formatted_date = FORMAT(DATEDIFF(s,'1970-01-01 00:00:00', @date) - @diff_sec, '00000000000');

--concat those strings
SET @final_string = CONCAT(..., @formatted_date, ...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 和 Java 之间的时间戳差异 的相关文章

  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 避免数据集中出现重复名称

    我正在从表中获取数据并绑定到标签并在 gridview 中下拉 但我想从表中过滤重复的名称并将相应的日期分配给 DDL 如何做到这一点 或者还有其他选择吗 private DataSet get string sql select Id N
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • SQL Server 返回了不完整的响应。连接已关闭。;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException:

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 该应用程序运行几个小时50线程 下面是我的 JDBC 配置 MSSQL DRIVERCLASSNAME com microsof
  • SQL Server:触发器如何读取插入、更新、删除的值

    我在一张表中有触发器并且想阅读UserId插入 更新或删除行时的值 怎么做 下面的代码不起作用 我收到错误UPDATED ALTER TRIGGER dbo UpdateUserCreditsLeft ON dbo Order AFTER
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • 字符串文字上的 SQL Server T-SQL N 前缀[重复]

    这个问题在这里已经有答案了 这可能是一个菜鸟问题 但我发现了一些 T SQL 查询示例来验证数据库大小SELECT and WHERE clause here http technet microsoft com en us library
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • 当我两次启动闹钟时会发生什么?

    我正在克服困难 当然 这并不那么复杂 以避免两次启动警报 基本代码如下 AlarmManager mgr AlarmManager getSystemService Context ALARM SERVICE Intent i new In
  • ElasticSearch 服务启动但无法访问并且不执行任何日志记录

    Azure 中 Linux Ubuntu 16 04 3 VM 上的 ElasticSearch 6 2 2 它一直运行良好 但几天前我重新启动机器后 我根本无法启动 ElasticSearch 服务 问题已在这里分享和解决 Elastic
  • 更改相关产品标题在 WooCommerce 中添加产品名称

    我有这段代码 试图将 相关产品 翻译成 这些产品与产品名称搭配得很好 这是我的代码 add filter gettext change related products title 10 3 function change related
  • 在编译时将 this 指针和类方法的参数传递给本地 lambda 函数

    假设您有一个场景 当您想要创建一个constexprlambda 在编译时计算某些内容的方法中 struct A int a constexpr A int a a a constexpr auto operator const A rhs
  • “if-then-else”(总是)可以被函数调用替换吗?

    这个问题主要是出于对 PL 如何工作的好奇 实际上我是在查看 SML 时想到的 SML 与 Haskell 的不同之处在于前者使用按值调用 但我的问题是关于 Haskell 的 Haskell 据我了解 具有 按需调用 语义 这是否意味着如
  • 快速的射弹并不总是能击中

    因此 对于我的游戏 有一个快速移动的子弹对象 其精灵大小为 5x5 大约 以大约 30 的速度移动 需要撞击厚度仅为 5 像素左右的相对较薄的 Enemy 物体 子弹以一定的固定距离间隔穿过敌人而不会发生碰撞 I think这是因为子弹移动
  • DataMan iPhone 应用程序如何在后台工作

    AppStore 上的 DataMan 应用程序 DataMan Lite 是该应用程序的免费版本 有助于监控您的数据使用情况 http www iphonelife com blog 2686 monitor your data usag
  • matlab如何求解大型、对称和稀疏线性系统

    也就是说 当我这样做时A b对于非常大 对称且稀疏的 A matlab 使用什么算法 如果矩阵是稀疏且对称正定的 但有very窄带 然后使用专门的带解算器 大多数矩阵没有足够窄的带来触发这种情况 通常 它会在样条工具箱中提供一维样条 二维问
  • 评估 MySQL 中的表达式

    我有一个包含 a b expr 列的表 expr 是其他列的表达式 例如表包含 a b expr 2 5 a b 3 4 a b 3 我喜欢简单地运行一个查询并获得流动的结果 a b expr 2 5 7 3 4 15 我在文档中搜索函数
  • SQL在同一字段中搜索多个值

    我正在构建一个简单的search算法 我想打破我的带空格的字符串 并在其上搜索我的数据库 如下所示 search Sony TV with FullHD support search explode search SELECT name F
  • 仅删除 vb.net 中的一个特定事件处理程序

    我正在编写一个小型 2D 引擎 使用 Lua 来控制它 过去一段时间我一直在 Lua 和 VB net 之间设置事件 我意识到 问题是我似乎无法删除那些搞砸了很多事情的事件 因为它们在应该完成的时候被调用 为了解决这个问题 我想添加某种方法
  • Python - Twisted、代理和修改内容

    所以我研究了一些涉及使用 python 和 Twisted 框架编写 HTTP 代理的事情 本质上 像其他一些问题一样 我希望能够修改将发送回浏览器的数据 也就是说 浏览器请求资源 代理将获取它 在资源返回到浏览器之前 我希望能够修改任何
  • Java 异常访问冲突?

    我目前正在编写一个 JNI 项目 在尝试运行 Java 代码时收到以下错误日志 它告诉我有问题的框架是 jvm dll 框架 在尝试隔离问题时 我试图找出我的问题到底在哪里 在 JVM 与我的本机代码中 我已附加了线程日志的一部分 并且可以
  • 从压缩文件中提取选定扩展名的所有文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 python 新手 我想从压缩文件中提取三个具有不同扩展名的单个文件 我不知道它们的文件名 只知道它们的扩展名 假设存在以下格式
  • 如何在C#服务中使用剪贴板?

    请记住 我使用的是服务而不是 Windows 窗体应用程序 当我尝试使用 System Windows Forms Clipboard GetText 时我的代码 不要进入下一步 意味着 System Windows Forms 控件已被弃
  • 引用另一个别名的别名

    我需要识别一个引用 Cmder 中另一个别名命令的别名命令 例如 假设我定义了firstAlias 如下所示 alias firstAlias cd blah blah 比我创建另一个使用上面别名的别名 例如 alias secondAli
  • SQL SELECT 每月的第一天和最后一天。

    最亲爱的专业人士 我构建了一个查询来获取当月的第一天和最后一天 但该月第一天的时间戳有问题 declare FirstDOM datetime LastDOM datetime set FirstDOM select dateadd dd
  • Sqlite 获取最大 id 不起作用(?)

    我用这个 SELECT WHERE id MAX id FROM history 但我的查询是空的 我也尝试过这个 这个有效 SELECT MAX id AS max id FROM history 但显然我的查询只包含 max id 键
  • 在java中将美元(大十进制)转换为美分(整数)的最佳方法是什么?

    我必须将我的网络应用程序与支付网关集成 我想输入美元总金额 然后将其转换为美分 因为我的支付网关库接受美分金额 类型Integer 我找到Big Decimal在java中是操纵货币的最佳方式 目前我输入的金额为 50 美元 并将其转换为I
  • SQL Server 和 Java 之间的时间戳差异

    我需要将一个简单的过程从 Java 代码复制到 SQL Server 存储过程 它将进入生产中的 SQL Azure 数据库 但我正在针对本地 SQL Express 12 安装对其进行测试 该存储过程的一部分是将一些值连接成一个字符串 这