我正在使用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 |
|------------|-------------|------------------------|------------|
这会增加我遇到的日子时会引起各种各样的问题。但是,仅此简单示例就足够了。
感谢您的建议。
Mikel Rychliski的回答几乎是正确的。
[正如我几年前在博客文章Trouble with time?中解释的那样,SAP HANA Studio是一个JAVA应用程序,它使用java.sql.Date
/ java.sql.Timestamp
对象来处理日期/时间戳信息。要使用它们,必须配置Calendar
。
没有进一步的配置(即提到的JVM参数-Duser.timezone
),JVM使用其default时区设置。
引用我的帖子:
如果JVM在Linux上运行,那将再次是TZ的值,在MS上Windows,这将是Windows用户的当前时区设置运行JVM。
如果您要使自己确信SAP HANA中的数据是正确的,则使用基于非JDBC的连接是一种简便的方法。
例如,只需通过hdbsql
或ODBC客户端运行代码。
我认为问题出在Hana Studio,因为在DBeave中,它按预期运行:P如果有人需要知道如何解决此问题,我将在此留下这个问题。
我将尝试在Hana Studio中找到一种解决方法,然后回发。
HANA Studio(和所有其他JDBC应用程序)假定数据库中存储的DATE
为UTC。这些值在获取时将转换为客户端的本地时区。
在您自己的JDBC应用程序中,可以在getDate()调用上传递Calendar对象,以指定要将服务器值转换为哪个时区。
HANA Studio取决于JVM时区设置,默认情况下是从OS读取的。为了避免在HANA Studio中出现此问题,您可以在hdbstudio.ini文件中添加JVM属性-Duser.timezone=UTC
(或更改计算机上的时区)。