Вставка даты и времени виджетов SWT в mariadb

#java #datetime #swt #prepared-statement #mariadb

#java #дата и время #swt #подготовленная инструкция #mariadb

Вопрос:

Мне нужна помощь. Я хочу сохранить значение datetime в своей базе данных, но там говорится, что временная метка метода неприменима к аргументу datetime, возможно, ссылаясь на код preparedstatement «.setTimestamp». Я использую SWT Datetime widget для получения начальной даты, но, похоже, я не могу поместить ее в подготовленную инструкцию. Значения даты и времени из виджета SWT передаются в соответствии с указанным параметром.

Вот приведенный ниже код:

 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();
            }
        }
  

Комментарии:

1. setTimestamp требуется java.sql.Timestamp значение not org.eclipse.swt.widgets.DateTime . Вам нужно будет преобразовать значение.

2. хорошо, спасибо. У меня возникла идея, учитывая, что класс swt datetime имеет методы getYear, getDay () и т.д., И, возможно, вы предлагаете мне преобразовать его вручную

Ответ №1:

Вам придется преобразовать DateTime в Timestamp самостоятельно:

 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));
  

Комментарии:

1. Конечно, есть более короткий способ!

2. @RickJames С чего бы это? Вам нужно получить время в миллисекундах из DateTime, и я не знаю более короткого способа. Просто оберните это в метод.

3.Если вам нужно текущее время, то SQL NOW(3) предоставит вам это. (Хорошо, возможно, вам не нужно текущее время.)

4. @RickJames SWT DateTime — неуклюжий виджет. К сожалению, вы не можете получить Date из него время эпохи напрямую. Отсюда и Calendar экземпляр. Это непросто, но если операционная система хочет получить временную метку из DateTime , то это способ сделать это.

5. @Baz Привет, спасибо за это, а также я считаю, что это должно быть dt.getMonth () 1 в случае SWT .

Ответ №2:

Позвольте MySQL выполнить преобразование, как вы INSERT :

 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 = 5G
*************************** 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 = 6G
*************************** 1. row ***************************
t2: 2016-10-22 10:03:49.739000
t3: 2016-10-22 10:03:49.7