【问题标题】:How can I use strftime function with question mark in Java如何在 Java 中使用带问号的 strftime 函数
【发布时间】:2022-01-04 17:56:55
【问题描述】:

我打算将“日期”对象添加到 SQLite 数据库中。但是,我收到关于插入为空的错误。 错误是这样的

org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL]  A NOT NULL constraint failed (NOT NULL constraint failed: dates.Tarih)
    at org.sqlite.core.DB.newSQLException(DB.java:909)
    at org.sqlite.core.DB.newSQLException(DB.java:921)
    at org.sqlite.core.DB.execute(DB.java:825)
    at org.sqlite.jdbc3.JDBC3PreparedStatement.execute(JDBC3PreparedStatement.java:53)



这是我的代码。我怀疑从问号。因为当我删除它们并将它们与'now' 一起放置时。它确实有效。但是,下面的代码会抛出上述错误。

插入方法


public static void insert(Date date, Date date2)  {
       try{
           System.out.println(" date:"+date.toString());

           String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y',?), strftime('%d-%m-%Y',?))";
           pst=conn.prepareStatement(query);
           pst.setObject(1,date);
           pst.setObject(2,date2);

           pst.execute();

       }catch (SQLException e){
           e.printStackTrace();
       }


    }

【问题讨论】:

标签: java sql sqlite date strftime


【解决方案1】:

可能您已将列 Tarih 定义为 NOT NULL,并且您的代码正尝试在表中插入 null 值。

你从strftime() 得到null 的原因是你没有为SQLite 传递一个有效的日期。
对于 SQLite,有效日期/日期时间可以是 yyyy-MM-dd hh:mm:ss 格式的字符串,也可以是整数 unix 纪元时间或代表儒略日的浮点数。

您传递的是 Date 对象,这是您的错误。

解决问题的一种方法是从每个Date 对象中提取一个表示unix 纪元时间的整数并将其传递给strftime()

public static void insert(Date date, Date date2)  {
    try{
        long d = date.toInstant().toEpochMilli() / 1000; 
        long d2 = date2.toInstant().toEpochMilli() / 1000;

        String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y', ?, 'unixepoch'), strftime('%d-%m-%Y', ?, 'unixepoch'))";
        pst=conn.prepareStatement(query);
        pst.setLong(1, d);
        pst.setLong(2, d2);
        pst.execute();
    } catch (SQLException e){
        e.printStackTrace();
    }
}

【讨论】:

  • 我不想将其转换为时间戳。我只想将其插入为 dd/mm/yyyy 格式
  • @Demir 我知道。除非您传递有效日期,否则 strfime() 不会格式化。 date 和 date1 是 Java 的 Date 对象,不是 SQLite 的有效日期。我的代码从这些 Date 对象中获取时间戳,并在 strftime() 中使用它们和修饰符 'uniepoch' 来指示函数这些数字是需要格式化的时间戳。
  • 谢谢,我明白了。效果很好。
猜你喜欢
  • 2011-04-10
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2014-09-09
  • 2021-09-19
  • 1970-01-01
相关资源
最近更新 更多