从java向sqlite插入日期时间的正确方法是什么?

从java向sqlite插入日期时间的正确方法是什么?,java,datetime,sqlite,Java,Datetime,Sqlite,当我尝试使用sqlite3查询通过JDBC插入的日期时,我看到了意外的结果。此java代码: try (Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db")) { conn.setAutoCommit(true); try (Statement statement = conn.createStatement()) { statement.executeUpdate("create

当我尝试使用sqlite3查询通过JDBC插入的日期时,我看到了意外的结果。此java代码:

try (Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db")) {
    conn.setAutoCommit(true);
    try (Statement statement = conn.createStatement()) {
        statement.executeUpdate("create table dates (date DATETIME);");
    }

    try (PreparedStatement insert = conn
            .prepareStatement("insert into dates values (?)")) {
        insert.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now()));
        insert.executeUpdate();
    }
}
似乎没有插入正确的日期时间-当我通过sqlite3查询它时,我无法获得人类可读的值:

sqlite3 test.db "select date, datetime(date, 'unixepoch') from dates;"
1507819362296|
这是有道理的,因为sqlite文档说有效的unix历元范围是“-62167219200到106751991167”()


我应该如何在JDBC和Sqlite中使用日期?

Sqlite中没有正式的日期或时间戳类型,而是用字符串表示。因此,如果要将当前时间戳插入表中,可以尝试以下操作:

try (Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db")) {
    conn.setAutoCommit(true);
    try (Statement statement = conn.createStatement()) {
        statement.executeUpdate("CREATE TABLE dates (date TEXT);");
    }

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    String ts = sdf.format(timestamp);

    try (PreparedStatement ps = conn
            .prepareStatement("INSERT INTO dates (date) VALUES (?)")) {
        ps.setString(1, ts);
        ps.executeUpdate();
    }
}

@Mark W我们一直在sqlite数据库中以字符串的形式输入日期,但它们不是像2017年10月18日这样看起来很漂亮的字符串,它们是这样输入的10182017,是的,它们都有8个字符长。但当你把他们拉出来时,他们都打扮好了,回到2017年10月18日。我们已经测试了我们的搜索,所有的搜索似乎都按照需要使用SELECT*FROM表格名称,其中COLU Date>=“FROM”和COLU Date 0&&tORf.equalsIgnoreCase(“false”)){ btnSave.setVisibility(View.INVISIBLE); String NVrowid=String.valueOf(dbList.get(position.getRowid()); 字符串NVstation=dbList.get(position).getStation_Name(); 字符串NVpurchasedate=dbList.get(position).getDate_of_Purchase(); 字符串s=NVpurchasedate; 字符串月份=s.substring(0,2); 字符串日=s.子字符串(2,4); 字符串年份=s.子字符串(4,8); 字符串date3=月+“-”+日+“-”+年; 字符串NVcost=dbList.get(position.getGas_Cost(); etStation.setText(NVstation); etPurchaseDate.setText(date3); //etPurchaseDate.setText(NVpurchasedate); etCost.setText(NVcost); }
我可以这样做,但这意味着我的应用程序现在包含了处理Sqlite中日期的内部表示的逻辑。并使我的代码特定于sqlite。似乎应该有一种更好的方法将sqlite实现细节留给JDBC驱动程序。@MarkW您使用的是哪个驱动程序,您可以编辑您的问题以包含指向该驱动程序文档的链接吗?@MarkW讨论了一个与您非常相似的问题,其结论是日期需要在SQLite和Java中作为字符串处理。
    public void findByDate(View view){
    use= false;
    // custom dialog /* THIS R.style.DatePickerThem is mandatory to use res/values/styles */
    final Dialog dialog = new Dialog(MainActivity.this,R.style.DatePickerTheme);
    dialog.setContentView(R.layout.datepickerview);
    dialog.setTitle("");
    DatePicker picker = dialog.findViewById(R.id.datePicker);
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    //picker.updateDate(2017, 10, 13);//year month day
    picker.updateDate(mYear, mMonth, mDay);// Keeps Calendar initial view what ever today is!

    System.out.println("Month " + mMonth+1);

    picker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {
        //picker.init(Integer.valueOf(mMonth),Integer.valueOf(mDay),Integer.valueOf(mYear), new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker picker, int year, int monthOfYear, int dayOfMonth) {

            if (etFromDate.getText().toString().isEmpty()) {
                System.out.println("I am Not Empty");

                //etFromDate.setText(String.valueOf(monthOfYear+1 ) + String.valueOf(dayOfMonth) + String.valueOf(year));
                //v1 = Long.valueOf(etFromDate.getText().toString());
                //etFromDate.setText(String.valueOf(v1));
                //String theDATE = (monthOfYear+1) + "-" + (dayOfMonth) + "-" + (year);
                String searchFrom = (String.valueOf(monthOfYear+1))+(String.valueOf(dayOfMonth))+String.valueOf(year);
                if(searchFrom.length()==7){
                    StringBuilder str = new StringBuilder(searchFrom);
                    str.insert(2, '0');
                    etFromDate.setText(str);
                }else if (searchFrom.length() == 6){
                    StringBuilder str = new StringBuilder(searchFrom);
                    str.insert(0,'0');
                    str.insert(2,'0');
                    etFromDate.setText(str);
                }else {
                    etFromDate.setText(searchFrom);
                }


                //setDATE = etFromDate.getText().toString();
                dialog.dismiss();
        helper = new DBHelper(this);
    dbList = new ArrayList<>();
    dbList = helper.getDataFromDB();

    if (dbList.size() > 0 && tORf.equalsIgnoreCase("false")) {

        btnSave.setVisibility(View.INVISIBLE);
        String NVrowid = String.valueOf(dbList.get(position).getRowid());
        String NVstation = dbList.get(position).getStation_Name();
        String NVpurchasedate = dbList.get(position).getDate_of_Purchase();
        String s = NVpurchasedate;
        String month = s.substring(0, 2);
        String day = s.substring(2, 4);
        String year = s.substring(4, 8);
        String date3 = month + "-" + day + "-" + year;
        String NVcost = dbList.get(position).getGas_Cost();
        etStation.setText(NVstation);
        etPurchaseDate.setText(date3);
        //etPurchaseDate.setText(NVpurchasedate);
        etCost.setText(NVcost);
    }