Java SWT小部件datetime插入到mariadb

Java SWT小部件datetime插入到mariadb,java,datetime,swt,prepared-statement,mariadb,Java,Datetime,Swt,Prepared Statement,Mariadb,我需要帮助。我想在数据库中存储一个datetime值,但它表示方法timestamp不适用于datetime参数,可能是指preparedstatement代码“.setTimestamp”。我使用SWT Datetime小部件来获取开始日期,但我似乎无法将其放入准备好的语句中。SWT小部件中的datetime值传递给给定的参数 下面是代码: public void addLeave(String leaveType, DateTime start, DateTime end, int half

我需要帮助。我想在数据库中存储一个datetime值,但它表示方法timestamp不适用于datetime参数,可能是指preparedstatement代码“.setTimestamp”。我使用SWT Datetime小部件来获取开始日期,但我似乎无法将其放入准备好的语句中。SWT小部件中的datetime值传递给给定的参数

下面是代码:

public void addLeave(String leaveType, DateTime start, DateTime end, int halfDay){
            try{
                Connection con = getConnection();

                String sql = "INSERT into leaves(user_id, leaves_type, leaves_halfDay,leaves_startDate, leaves_endDate) VALUES(?,?,?,?,?)";
                PreparedStatement addLeave = con.prepareStatement(sql);

                addLeave.setString(1, Pkey);
                addLeave.setString(2, leaveType);
                addLeave.setInt(3, halfDay);
                addLeave.setTimestamp(4, start);
                addLeave.setTimestamp(5, end);
                addLeave.execute();

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

您必须自己将
日期时间
转换为
时间戳

private Timestamp getTimestamp(DateTime dt)
{
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR,         dt.getYear());
    cal.set(Calendar.MONTH,        dt.getMonth());
    cal.set(Calendar.DAY_OF_MONTH, dt.getDay());
    cal.set(Calendar.HOUR_OF_DAY,  dt.getHours());
    cal.set(Calendar.MINUTE,       dt.getMinutes());
    cal.set(Calendar.SECOND,       dt.getSeconds());

    return new Timestamp(cal.getTimeInMillis());
}
那么就这样称呼它:

addLeave.setTimestamp(4, getTimestamp(start));

您必须自己将
日期时间
转换为
时间戳

private Timestamp getTimestamp(DateTime dt)
{
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR,         dt.getYear());
    cal.set(Calendar.MONTH,        dt.getMonth());
    cal.set(Calendar.DAY_OF_MONTH, dt.getDay());
    cal.set(Calendar.HOUR_OF_DAY,  dt.getHours());
    cal.set(Calendar.MINUTE,       dt.getMinutes());
    cal.set(Calendar.SECOND,       dt.getSeconds());

    return new Timestamp(cal.getTimeInMillis());
}
那么就这样称呼它:

addLeave.setTimestamp(4, getTimestamp(start));

让MySQL在插入时进行转换:

CREATE TABLE `ts_dt_n` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t2` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `t3` datetime(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

INSERT into ts_dt_n (t2, t3) values (FROM_UNIXTIME(1477155329.123),
                                     FROM_UNIXTIME(1477155329.123));

SELECT t2, t3 FROM  ts_dt_n WHERE id = 5\G
*************************** 1. row ***************************
t2: 2016-10-22 09:55:29.123000
t3: 2016-10-22 09:55:29.1
如果您来自Java的毫秒计时器,则在转换和插入时除以1000:

INSERT INTO ts_dt_n (t2, t3) values (FROM_UNIXTIME(1477155829739/1000),
                                     FROM_UNIXTIME(1477155829739/1000));

SELECT t2, t3 FROM  ts_dt_n WHERE id = 6\G
*************************** 1. row ***************************
t2: 2016-10-22 10:03:49.739000
t3: 2016-10-22 10:03:49.7

让MySQL在插入时进行转换:

CREATE TABLE `ts_dt_n` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t2` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `t3` datetime(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

INSERT into ts_dt_n (t2, t3) values (FROM_UNIXTIME(1477155329.123),
                                     FROM_UNIXTIME(1477155329.123));

SELECT t2, t3 FROM  ts_dt_n WHERE id = 5\G
*************************** 1. row ***************************
t2: 2016-10-22 09:55:29.123000
t3: 2016-10-22 09:55:29.1
如果您来自Java的毫秒计时器,则在转换和插入时除以1000:

INSERT INTO ts_dt_n (t2, t3) values (FROM_UNIXTIME(1477155829739/1000),
                                     FROM_UNIXTIME(1477155829739/1000));

SELECT t2, t3 FROM  ts_dt_n WHERE id = 6\G
*************************** 1. row ***************************
t2: 2016-10-22 10:03:49.739000
t3: 2016-10-22 10:03:49.7

setTimestamp
需要
java.sql.Timestamp
值而不是
org.eclipse.swt.widgets.DateTime
。您必须转换值。好的,谢谢。我的想法是考虑到swt datetime类确实有getYear、getDay()等方法,也许您建议我手动转换它
setTimestamp
想要
java.sql.Timestamp
值而不是
org.eclipse.swt.widgets.datetime
。您必须转换值。好的,谢谢。我的想法是考虑到swt datetime类确实有getYear、getDay()等方法,也许你建议我手动转换它,因为有一个更短的方法@里克詹姆斯,为什么会有?你需要从DateTime开始以毫秒为单位计算时间,我不知道更短的方法。如果你需要当前时间,那么SQL
NOW(3)
会给你这个。(好吧,也许你不想要当前时间。)@rickjamesswt
DateTime
是一个笨拙的小部件。不幸的是,您无法直接从中获取大纪元时间的日期。因此,
日历
实例。这很痛苦,但是如果OP想要从
日期时间
中获取时间戳,那么这就是方法。@Baz-Hi,谢谢你,而且我认为在SWT的情况下应该是dt.getMonth()+1。当然还有一个更短的方法@里克詹姆斯,为什么会有?你需要从DateTime开始以毫秒为单位计算时间,我不知道更短的方法。如果你需要当前时间,那么SQL
NOW(3)
会给你这个。(好吧,也许你不想要当前时间。)@rickjamesswt
DateTime
是一个笨拙的小部件。不幸的是,您无法直接从中获取大纪元时间的日期。因此,
日历
实例。这很痛苦,但是如果OP想要从
日期时间
中获取时间戳,那么这就是方法。@Baz-Hi,谢谢你,而且我认为在SWT的情况下应该是dt.getMonth()+1。