diff --git "a/qtbase/src/plugins/sqldrivers/oci/qsql_oci.cpp" "b/qtbase/src/plugins/sqldrivers/oci/qsql_oci.cpp" index 3138a20..d0bfafa 100644 --- "a/qtbase/src/plugins/sqldrivers/oci/qsql_oci.cpp" +++ "b/qtbase/src/plugins/sqldrivers/oci/qsql_oci.cpp" @@ -113,6 +113,9 @@ static const ub2 qOraCharset = OCI_UCS2ID; typedef QVarLengthArray IndicatorArray; typedef QVarLengthArray SizeArray; +static QByteArray qMakeOraDate(const QDateTime& dt); + + static QByteArray qMakeOCINumber(const qlonglong &ll, OCIError *err); static QByteArray qMakeOCINumber(const qulonglong& ull, OCIError* err); @@ -372,8 +375,19 @@ int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, in reinterpret_cast(data)->size(), SQLT_BIN, indPtr, 0, 0, 0, 0, OCI_DEFAULT); break; + + case QVariant::Date: { + QByteArray ba = qMakeOraDate(val.toDateTime()); + r = OCIBindByPos(sql, hbnd, err, + pos + 1, + ba.data(), + ba.size(), + SQLT_DAT, indPtr, 0, 0, 0, 0, OCI_DEFAULT); + tmpStorage.rawData.append(ba); + break; + } + case QVariant::Time: - case QVariant::Date: case QVariant::DateTime: { QOCIDateTime *ptr = new QOCIDateTime(env, err, val.toDateTime()); r = OCIBindByPos(sql, hbnd, err, @@ -778,6 +792,27 @@ static QSqlField qFromOraInf(const OraFieldInfo &ofi) return f; } +/*! + \internal + + Convert QDateTime to the internal Oracle DATE format NB! + It does not handle BCE dates. +*/ +QByteArray qMakeOraDate(const QDateTime& dt) +{ + QByteArray ba; + ba.resize(7); + int year = dt.date().year(); + ba[0]= (year / 100) + 100; // century + ba[1]= (year % 100) + 100; // year + ba[2]= dt.date().month(); + ba[3]= dt.date().day(); + ba[4]= dt.time().hour() + 1; + ba[5]= dt.time().minute() + 1; + ba[6]= dt.time().second() + 1; + return ba; +} + /*! \internal