Как преобразовать «30.01.2008 14:29:23» в формат smalldatetime? Я использую MSSQL для своего приложения и столбец формата smalldatetime - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь преобразовать строку в формате «02.01.2008 02:48:04» в формат smalldatetime для вставки в MS SQL.

import java.sql.Date;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class TimeStampTest {

    public static void main(String[] args) {
        String originalDate ="01/02/2018 02:29:23 PM";
        System.out.println(convertToSmallDatetimeFormat(originalDate));
    }

    private static Timestamp convertToSmallDatetimeFormat(String originalDate) {


        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("MM/dd/yyyy hh:mm:ss a")
                .toFormatter(Locale.US);
        LocalDateTime localDate = LocalDateTime.parse(originalDate,formatter);

        return new Timestamp(localDate.getNano()/1000000);

    }

}

Но я понял, что когда я делаю следующий код

LocalDateTime localDate = LocalDateTime.parse(originalDate,formatter);

Я получаю какое-то мусорное значение 2018-01-02T15: 58: 04

, в результате чего localDate.getNano () будет 0

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Вы можете использовать Timestamp.valueOf

private static Timestamp convertToSmallDatetimeFormat(String originalDate) {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MM/dd/yyyy hh:mm:ss a")
            .toFormatter(Locale.US);
    LocalDateTime localDate = LocalDateTime.parse(originalDate,formatter);
    System.out.println("****"+localDate);
    return Timestamp.valueOf(localDate);
}
0 голосов
/ 22 апреля 2019

Чтобы преобразовать строку и вставить ее как smalldatetime, вам вообще не нужно использовать java.sql.Timestamp.Просто передайте объект LocalDateTime в PreparedStatement#setObject следующим образом:

Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id int PRIMARY KEY, sdt smalldatetime)");

PreparedStatement ps = conn.prepareStatement("INSERT INTO #tmp (id, sdt) VALUES (?, ?)");
ps.setInt(1, 1);
String originalDate = "01/02/2018 02:29:43 PM";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("MM/dd/yyyy hh:mm:ss a")
        .toFormatter(Locale.US);
LocalDateTime ldt = LocalDateTime.parse(originalDate, formatter);
System.out.println(ldt);  // 2018-01-02T14:29:43
ps.setObject(2, ldt);
ps.executeUpdate();

И, если вы используете mssql-jdbc версия 7.1.0 или выше, вы можете получить значения напрямуюв LocalDateTime объект (я создал запрос на получение для этой функции)

ResultSet rs = st.executeQuery("SELECT sdt FROM #tmp WHERE id=1");
rs.next();
LocalDateTime retrieved = rs.getObject(1, LocalDateTime.class);
System.out.println(retrieved);  // 2018-01-02T14:30
// note that the minutes value is rounded
0 голосов
/ 19 апреля 2019

Вы можете сделать это из самого запроса MySQL, что может сэкономить вам время:

В зависимости от того, какую версию вы используете, это для MariaDB

SELECT DATE_FORMAT(date, "%Y-%m-%d  %H:%M:%S") date FROM `table`
...