From 6e0c43b2e7e5758288531c1a3a1f1651efd473f9 Mon Sep 17 00:00:00 2001 From: Zhivka Dimova Date: Wed, 14 May 2025 21:21:35 +0200 Subject: [PATCH] [jdbc] SQLite - Fix insert time format when using persist method of an item (#18407) Signed-off-by: Zhivka Dimova --- .../jdbc/internal/db/JdbcSqliteDAO.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcSqliteDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcSqliteDAO.java index 7e8c8bb490b..efd47dc8df8 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcSqliteDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcSqliteDAO.java @@ -42,6 +42,8 @@ public class JdbcSqliteDAO extends JdbcBaseDAO { private final Logger logger = LoggerFactory.getLogger(JdbcSqliteDAO.class); + private static final String DATETIME_FORMAT = "'%Y-%m-%d %H:%M:%f'"; + /******** * INIT * ********/ @@ -66,7 +68,7 @@ public class JdbcSqliteDAO extends JdbcBaseDAO { */ private void initSqlTypes() { logger.debug("JDBC::initSqlTypes: Initialize the type array"); - sqlTypes.put("tablePrimaryValue", "strftime('%Y-%m-%d %H:%M:%f' , 'now' , 'localtime')"); + sqlTypes.put("tablePrimaryValue", "strftime(" + DATETIME_FORMAT + " , 'now', 'localtime')"); } /** @@ -130,10 +132,13 @@ public class JdbcSqliteDAO extends JdbcBaseDAO { ItemVO storedVO = storeItemValueProvider(item, itemState, vo); String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue, new String[] { "#tableName#", "#dbType#", "#tablePrimaryValue#" }, - new String[] { formattedIdentifier(storedVO.getTableName()), storedVO.getDbType(), "?" }); - java.sql.Timestamp timestamp = new java.sql.Timestamp(date.toInstant().toEpochMilli()); - Object[] params = { timestamp, storedVO.getValue() }; - logger.debug("JDBC::doStoreItemValue sql={} timestamp={} value='{}'", sql, timestamp, storedVO.getValue()); + new String[] { formattedIdentifier(storedVO.getTableName()), storedVO.getDbType(), + "strftime(" + DATETIME_FORMAT + " , ?, 'unixepoch', 'localtime')" }); + + double epochSecondsWithMillis = date.toInstant().toEpochMilli() / 1_000.0; + Object[] params = { epochSecondsWithMillis, storedVO.getValue() }; + logger.debug("JDBC::doStoreItemValue sql={} epochSecondsWithMillis={} value='{}'", sql, epochSecondsWithMillis, + storedVO.getValue()); try { Yank.execute(sql, params); } catch (YankSQLException e) {