SAP HANA - 处理日期数据类型的问题
SAP HANA - problem with handling date-datatype
我正在使用 SAP HANA,我需要对日期做一些事情(主要是添加天数)。
我在处理一年中的某一天,即 5 月的第二个星期六时遇到了问题。我的猜测是这与夏令时有关。
我简化查询以显示问题。
DO
BEGIN
DECLARE FECHA VARCHAR(20) = '2020-05-10';
SELECT :FECHA AS D1
, TO_DATE(:FECHA) AS D2
, TO_VARCHAR(TO_DATE(:FECHA)) AS D3
FROM DUMMY;
END;
我得到的结果是这样的:
|------------|-------------|------------------------|------------|
| D1 | D2 | D3 | D4 |
|------------|-------------|------------------------|------------|
| 2020-05-10 | 09-may-2020 | 09-may-2020 23:00:00.0 | 2020-05-10 |
|------------|-------------|------------------------|------------|
这在添加天数时会导致各种问题,这正是我遇到的问题。但是仅仅这个简单的例子就已经足够了。
提前感谢您的建议。
我认为问题出在 Hana Studio,因为在 DBeave 中它按预期工作:P
我把这个问题留在这里,以防其他人需要知道如何解决这个问题。
我会尝试在 Hana Studio 中找到修复它的方法,然后 post 返回。
HANA Studio(以及所有其他 JDBC 应用程序)假定 DATE
存储在数据库中的时间为 UTC。这些值在获取时会转换为客户端的本地时区。
在您自己的 JDBC 应用程序中,您可以在 getDate() 调用上传递一个日历对象,以指定您希望将服务器值转换到哪个时区。
HANA Studio 取决于 JVM 时区设置,默认情况下从 OS 读取。为避免在 HANA Studio 中出现此问题,您可以在 hdbstudio.ini 文件中添加 JVM 属性 -Duser.timezone=UTC
(或更改计算机上的时区)。
Mikel Rychliski 的回答几乎是正确的。
正如我几年前在博客 post Trouble with time? 中解释的那样,SAP HANA Studio 是一个 JAVA 应用程序,它使用 java.sql.Date
/java.sql.Timestamp
处理 date/timestamp 信息的对象。要使用它们,必须配置 Calendar
。
如果没有进一步配置(即提到的 JVM 参数 -Duser.timezone
),JVM 使用其 默认 时区设置。
引用我的post:
If the JVM runs on Linux, that would be the value of TZ again, on MS
Windows it would be the current timezone setting for the Windows user
that runs the JVM.
如果您想确信 SAP HANA 中的数据是正确的,使用非 JDBC 连接是一种简单的方法。
例如,仅通过 hdbsql
或 ODBC 客户端 运行 您的代码。
我正在使用 SAP HANA,我需要对日期做一些事情(主要是添加天数)。
我在处理一年中的某一天,即 5 月的第二个星期六时遇到了问题。我的猜测是这与夏令时有关。
我简化查询以显示问题。
DO
BEGIN
DECLARE FECHA VARCHAR(20) = '2020-05-10';
SELECT :FECHA AS D1
, TO_DATE(:FECHA) AS D2
, TO_VARCHAR(TO_DATE(:FECHA)) AS D3
FROM DUMMY;
END;
我得到的结果是这样的:
|------------|-------------|------------------------|------------|
| D1 | D2 | D3 | D4 |
|------------|-------------|------------------------|------------|
| 2020-05-10 | 09-may-2020 | 09-may-2020 23:00:00.0 | 2020-05-10 |
|------------|-------------|------------------------|------------|
这在添加天数时会导致各种问题,这正是我遇到的问题。但是仅仅这个简单的例子就已经足够了。
提前感谢您的建议。
我认为问题出在 Hana Studio,因为在 DBeave 中它按预期工作:P 我把这个问题留在这里,以防其他人需要知道如何解决这个问题。
我会尝试在 Hana Studio 中找到修复它的方法,然后 post 返回。
HANA Studio(以及所有其他 JDBC 应用程序)假定 DATE
存储在数据库中的时间为 UTC。这些值在获取时会转换为客户端的本地时区。
在您自己的 JDBC 应用程序中,您可以在 getDate() 调用上传递一个日历对象,以指定您希望将服务器值转换到哪个时区。
HANA Studio 取决于 JVM 时区设置,默认情况下从 OS 读取。为避免在 HANA Studio 中出现此问题,您可以在 hdbstudio.ini 文件中添加 JVM 属性 -Duser.timezone=UTC
(或更改计算机上的时区)。
Mikel Rychliski 的回答几乎是正确的。
正如我几年前在博客 post Trouble with time? 中解释的那样,SAP HANA Studio 是一个 JAVA 应用程序,它使用 java.sql.Date
/java.sql.Timestamp
处理 date/timestamp 信息的对象。要使用它们,必须配置 Calendar
。
如果没有进一步配置(即提到的 JVM 参数 -Duser.timezone
),JVM 使用其 默认 时区设置。
引用我的post:
If the JVM runs on Linux, that would be the value of TZ again, on MS Windows it would be the current timezone setting for the Windows user that runs the JVM.
如果您想确信 SAP HANA 中的数据是正确的,使用非 JDBC 连接是一种简单的方法。
例如,仅通过 hdbsql
或 ODBC 客户端 运行 您的代码。