LocalDateTime 和 SQL Server JDBC 4.2 驱动程序

2023-11-23

我正在尝试使用新的java.time具有最新版本的 Sql Server JDBC 驱动程序的类。据我所知,它应该只适用于方法:PreparedStatement.setObject() and ResultSet.getObject().

所以我创建了示例代码,但无法使其与结果集一起使用。我不知道我在这里做错了什么。

Connection connection = DriverManager.getConnection(connectionString);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM myTable WHERE ? BETWEEN date_from AND date_to");
preparedStatement.setObject(1, LocalDateTime.now());   // That works

ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
    Object o = resultSet.getObject("date_from"); 
    o.getClass() returns java.sql.Timestamp

    LocalDateTime dateTime = resultSet.getObject("date_from", LocalDateTime.class);
}

这会引发异常:

com.microsoft.sqlserver.jdbc.SQLServerException:不支持到类 java.time.LocalDateTime 的转换。

驱动程序版本:mssql-jdbc-6.5.4.jre8-preview.jar

SQL Server 版本:2016


https://learn.microsoft.com/en-us/sql/connect/jdbc/jdbc-4-2-compliance-for-the-jdbc-driver?view=sql-server-2017

如何解释底部表格中的这句话:

Java 8 中的新 Java 类: 本地日期/本地时间/本地日期时间, 偏移时间/偏移日期时间

新的 JDBC 类型: TIME_WITH_TIMEZONE, TIMESTAMP_WITH_TIMEZONE, REF_CURSOR

REF_CURSOR is not supported in SQL Server. Driver throws a SQLFeatureNotSupportedException exception if this type is used. The driver supports all other new Java and JDBC type mappings as specified in the JDBC 4.2 specification.


我不知道我在这里做错了什么。

你没有做错任何事。您之前遇到过 Microsoft SQL Server 的 JDBC 驱动程序的缺陷版本7.1.0, 讨论了here.

如果您使用的是 mssql-jdbc 版本 7.1.0 或更高版本,那么您可以使用getObject(x, LocalDateTime.class)正如预期的那样。

对于 7.1.0 之前的 mssql-jdbc 版本,正如其他人所建议的那样,您需要检索Timestamp并将其转换为LocalDateTime。但是,请注意,简单的解决方案......

LocalDateTime dateTime = resultSet.getTimestamp("date_from").toLocalDateTime()

...如果 JVM 的默认时区遵守夏令时(又称“夏令时”),则会损坏某些日期/时间值。例如,

// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));

// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();

// test code
LocalDateTime x = rs.getTimestamp("dt2").toLocalDateTime();  // bad

System.out.println(x.toString());

将打印“2018-03-11T03:00”。请注意,时间是“03:00”,而不是“02:00”。

相反,您需要检索Timestamp作为 UTC,然后将其转换为LocalDateTime对于 UTC,从而删除时区部分

// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));

// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();

// test code
Timestamp ts = getTimestamp("dt2", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
LocalDateTime x = LocalDateTime.ofInstant(ts.toInstant(), ZoneId.of("UTC"));  // good

System.out.println(x.toString());

打印“2018-03-11T02:00”。

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

LocalDateTime 和 SQL Server JDBC 4.2 驱动程序 的相关文章

随机推荐

  • 如何在log4net中为多行日志条目添加缩进?

    我知道这个问题我同意这个答案 但是我可以使用 log4net 执行以下操作吗 而不是 2013 04 09 12 54 47 093 INFO Main Line 1 Line 1 Line 1 Line 2 Line 2 Line 2 L
  • 缩放后的 QPixmap 看起来很糟糕

    我有以下小部件 pixmap QtGui QPixmap r pics cdaudio png scaled 100 100 图像从 256x256 缩小 它看起来相当不稳定 如何在 Qt 内平滑地扩展它 Use the transform
  • 当 mysql_query 返回 false 时

    除了编写错误的查询并且没有访问表的权限之外 当mysql query返回假 还有其他案例吗 请参阅参考指南 对于 SELECT SHOW DESCRIBE EXPLAIN 等返回的语句 结果集 mysql query 成功时返回资源 否则返
  • 我的 App Engine 应用程序不会自动创建默认存储桶

    我的应用程序引擎应用程序不会自动创建默认存储桶我不明白这是为什么 我的其他应用程序工作正常 但是当我在新应用程序中运行相同的代码时 我正在处理它 但它不会创建 Google 云存储桶 有人有主意吗 已弃用的方法 转到您的 App Engin
  • 将整数列表传递给存储过程

    这是我的存储过程 ALTER PROCEDURE dbo Dan numbers varchar 10 AS BEGIN SET NOCOUNT ON select numbers numbers END 在SSMS中 我可以像这样成功执行
  • 单击浏览器后退按钮时如何调用事件

    单击浏览器后退按钮时如何调用 jquery 事件 我在 asp net mvc 中使用单页应用程序 我想在用户按下浏览器的后退按钮时显示一个确认框以离开屏幕 我如何在浏览器后退按钮上调用 jquery 函数 请帮忙 我已经搜索并找到了推送状
  • “ProductList”对象没有属性“object_list”

    In my ProductList类 当我尝试打电话时get context data在另一种方法中 我收到错误 ProductList object has no attribute object list def get context
  • Google Analytics 有没有办法像 Mixpanel 一样跟踪多个事件参数?

    Given trackEvent category action opt label opt value opt noninteraction 我尝试使用 opt label 但它似乎只是一个字符串 并且不接受像 Mixpanel 那样的不
  • Python:排序函数在存在 nan 时中断

    sorted 2 float nan 1 回报 2 nan 1 至少在 Activestate Python 3 1 实现上是这样 我明白nan是一个奇怪的对象 所以如果它出现在排序结果中的随机位置我不会感到惊讶 但它也搞乱了容器中非 na
  • 转义大括号位于车把中的表达式旁边

    无法理解如何转义位于表达式旁边的 或 符号Handbars Java 模板引擎 我正在使用车把模板生成纯文本 因此我无法按照建议使用大括号的 HTML ASCII 代码there 我需要这样的表达 variable name 待解决 var
  • 使用 ACTION_IMAGE_CAPTURE 以较低分辨率打开 Android 相机

    我正在使用这样的意图打开 Android 相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE cameraIntent put
  • GWT 2.7 + GAE 应用程序在部署时查找代码服务器

    为什么 appengine 尝试使用超级开发模式 每次我将 GWT 应用程序部署到 appengine 并尝试访问它时 我都会看到白色的加载屏幕 然后大约 20 30 秒后我会收到以下消息 我使用 Maven 与gwt maven 插件 a
  • hibernate如何从现有数据库视图中检索数据?

    我是冬眠新手 我的问题是我有一个 Oracle 数据库 我在数据库中有一个视图 现在我想使用 hibernate 来检索该视图中的数据 有没有可能的解决方案 下面的代码片段可以解决您的问题 该代码片段是从教程中提取的 将 Hibernate
  • 为什么 Object.create(null) 的 __proto__ 未定义?

    在阅读 Javascript 原型时 我遇到了这种我无法解释的行为 我正在 chrome 的控制台 V8 中对此进行测试 var fruit taste good var banana Object create fruit console
  • 如何避免 Java 游戏中的垃圾收集延迟? (最佳实践)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在为 Android 平台调整 Java 交互游戏的性能 有时 垃圾收集的绘图和交互会出现问题 通常它不到十分之一秒 但有时在非常慢的设备上可能会长达 200 毫秒 我正在使
  • 检查两个 Python 正则表达式模式是否等效

    我想写一个正则表达式re VERBOSE模式 但我不相信我会毫无错误地添加详细部分 我记得 理论上 两个正则表达式的等价性 至少没有反向引用 可以通过生成它们的自动机并尝试找到图双射来找到 但我看不到用于比较正则表达式的实例方法 有没有办法
  • 无法使用滚动条使 DIV 宽度为 100%

    我有一个带有 DIV 和 TABLE 的页面 DIV 是我的标题 即使显示水平滚动条 我也希望它的宽度为 100 由于某种原因 它只占用 100 的可见窗口 我的 HTML 代码是 div style background color ye
  • WCF、Web 服务或 ADO.NET 数据服务:我应该使用什么?

    对于一个项目 我必须在 Web 服务器上托管的数据库与互联网上的多个客户端之间实现通信 在阅读了一些内容并观看了一些有关可能的 微软 技术的介绍性视频后 我发现我似乎 至少 有三个选择 1 Windows 通信基础 WCF 2 ASP NE
  • 目标框架下拉列表为空

    我安装了 VS NET 2010 Premium 但在尝试针对现有 NET 框架时似乎出现问题 当我打开 Web 应用程序项目的属性时 我得到的唯一选项是安装框架 如果我打开任何其他项目类型的属性 我会得到完整列表 到目前为止 我已执行以下
  • LocalDateTime 和 SQL Server JDBC 4.2 驱动程序

    我正在尝试使用新的java time具有最新版本的 Sql Server JDBC 驱动程序的类 据我所知 它应该只适用于方法 PreparedStatement setObject and ResultSet getObject 所以我创