Строка Java на дату

У меня есть хранимая процедура, для которой требуются следующие входные параметры:

PROCEDURE `Report_Publishing`(p_StartDate datetime, p_EndDate dateTime, p_Action varchar(15))


Из внешнего интерфейса я получаю даты начала и окончания в следующем формате -
start as a String "2017-03-15" и end as a String "2017-04-17",

Ниже приведен фрагмент кода для преобразования дат начала и окончания в требуемый формат хранимой процедуры -

import java.sql.CallableStatement;
import java.sql.Connection;
import java.util.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.text.SimpleDateFormat; 

public List<PublishReportDto> getExport(String start, String end, String action, Connection conn, String sql) {
        List<PublishReportDto> publishList = null;

        try {
            CallableStatement cs = conn.prepareCall(sql);

            start += " 00:00:00";
            end += " 00:00:00";
            Date startDate = null;
            Date endDate = null;
            try {
                startDate = (Date) new SimpleDateFormat("yyyy-MM-dd").parse(start);
                endDate = (Date) new SimpleDateFormat("yyyy-MM-dd").parse(end);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            cs.setDate(1,(java.sql.Date) startDate);
            cs.setDate(2,(java.sql.Date) endDate);
            cs.setString(3, action);
            cs.registerOutParameter(1, java.sql.Types.DATE);
            cs.registerOutParameter(2, java.sql.Types.DATE);
            cs.registerOutParameter(3, java.sql.Types.VARCHAR);
            ResultSet rs = cs.executeQuery();

Я получаю следующее исключение:

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date


Модификации -
Заменено -
1. import java.sql.Date с импортом java.util.Date;
2.

cs.setDate(1,startDate);
cs.setDate(2,endDate);

by

cs.setDate(1,(java.sql.Date) startDate);
cs.setDate(2,(java.sql.Date) endDate);

Теперь я получаю -

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

Может ли кто-нибудь помочь мне?


person Ani    schedule 12.04.2017    source источник


Ответы (4)


вы можете преобразовать из java.util.Date в java.sql.Date с помощью конструктора java.sql.Date:

Date(длинная дата) //конструктор java.sql.Date

Создает объект Date, используя заданное значение времени в миллисекундах.

чтобы получить дату начала:

Date startDate = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(start).getTime());

чтобы получить дату окончания:

Date endDate = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(end).getTime());

примечание — в будущем. Если вы собираетесь работать только со значениями даты, вам следует использовать LocalDate, а не java.util.Date.

person Ousmane D.    schedule 12.04.2017
comment
Привет, ваше решение сработало, хотя теперь я получаю следующее исключение: java.sql.SQLException: параметр номер 1 не является параметром OUT. - person Ani; 12.04.2017

Вы можете попробовать реализовать что-то в своем коде следующим образом:

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); 

Дата проанализирует введенную вами строку, а затем даст вам правильную дату, надеюсь, это поможет :)

person beastlyCoder    schedule 12.04.2017

Вы импортировали неправильный Date. Обратите внимание, что вы импортировали java.sql.Date, что соответствует приведению (Date), измените этот импорт на java.util.Date, и он должен работать.

SimpleDateFormat.parse() возвращает экземпляр java.util.Date, который отличен от java.sql.Date, и вы не можете преобразовать его из одного в другой. Можно конвертировать, если нужен java.sql.Date.

person Chris Thompson    schedule 12.04.2017
comment
это устранило исключение, но теперь моя startDate содержит -> Wed Mar 15 00:00:00 IST 2017 , будет ли этот формат соответствовать формату ввода моей хранимой процедуры? - person Ani; 12.04.2017

Вы можете передать (java.util.Date) Date obj в конструктор java.sql.Date

java.util.Date startDate = new java.util.Date();
            java.sql.Date sqlDate = new java.sql.Date(startDate.getTime());
person Bhushan Uniyal    schedule 12.04.2017