Не вижу секунд в SQL запросе

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Не вижу секунд в SQL запросе

Post by uniqueman »

В таблице есть колонка с типом datetime.

Когда я выполняю SQL запрос в самой базе и хочу посмотреть данные этой колонки, то данные возвращаются полностью в формате "dd mm yy hh:mm:ss"

а когда пытаюсь выполнить тот тже самый запрос в приложении, то данные возвращаются БЕЗ секунд. В каком месте смотреть?

Интерфейс - DB-Library for C

Спасибо
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

"Во всем виноват Чубайс" (c) в смысле приложение
Если оно конечно не читает convert(varchar по какому нибудь обрезанному формату
DBlib очень старый но млисекунды не режет
Кстати провеьте что у Вас не smalldatetime
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Re: Не вижу секунд в SQL запросе

Post by roadman »

uniqueman wrote:В таблице есть колонка с типом datetime.

Когда я выполняю SQL запрос в самой базе и хочу посмотреть данные этой колонки, то данные возвращаются полностью в формате "dd mm yy hh:mm:ss"

а когда пытаюсь выполнить тот тже самый запрос в приложении, то данные возвращаются БЕЗ секунд. В каком месте смотреть?

Интерфейс - DB-Library for C

Спасибо


Смотрите как вы bind буфер при отборе строк
<PRE>
void
....::BindOneColumn(WORD wIndex)
{
CAfColumnInfo *pFieldInfo = &m_pFieldInfo[wIndex];
switch (pFieldInfo->nNativeType) // bind by native type
{
..........
case SQLDATETIME: // long datetime 8 byte
pFieldInfo->pBuffer = new DBDATETIME; // allocate memory
pFieldInfo->nCType = AF_DATE; // AF date
pFieldInfo->nBindType = DATETIMEBIND; // Native bind datetime
pFieldInfo->nExactLength = sizeof(DBDATETIME); // set length
pFieldInfo->nLength = pFieldInfo->nExactLength; // set length
break;
case SQLDATETIM4: // short datetime 4 byte
pFieldInfo->pBuffer = new DBDATETIM4; // allocate memory
pFieldInfo->nCType = AF_DATE; // AF date
pFieldInfo->nBindType = DATETIMEBIND; // Native bind datetime
pFieldInfo->nExactLength = sizeof(DBDATETIM4); // set length
pFieldInfo->nLength = pFieldInfo->nExactLength; // set length
break;
default: // don't support type
ATLASSERT(false);
}

// bind column
RETCODE retCode = dbbind(m_pDBProcess, wIndex + 1, pFieldInfo->nBindType,
pFieldInfo->nLength, (BYTE *)pFieldInfo->pBuffer);
// check code
RETCODE_THROW(retCode)
// bind buffer for null flags
retCode = dbnullbind(m_pDBProcess, wIndex + 1, (long*)&pFieldInfo->nNullability);
// check code
RETCODE_THROW(retCode)
}

</PRE>

и как вы конвертируете дату, например, в Microsoft double date

<PRE>
void
...::ConvertOneValue(WORD wIndex, VARIANT *pVar)
{
CAfColumnInfo *pFieldInfo = &m_pFieldInfo[wIndex];

if (pFieldInfo->nNullability == -1) // null value
{
pVar->vt = VT_NULL;
return;
}

switch (pFieldInfo->nNativeType)
{
............
case SQLDATETIME: // long datetime
pVar->vt = VT_DATE;
{
DBDATETIME *pDateStruct = (DBDATETIME*)pFieldInfo->pBuffer;
// convert days
long ldays = pDateStruct->dtdays + 2;
double dbtime = (double)pDateStruct->dttime;
// convert time
dbtime /= (24*60*60*300); // convert 300th second to DATE format
pVar->date = (double)ldays + dbtime;
}
break;
case SQLDATETIM4: // short datatime
pVar->vt = VT_DATE;
{
DBDATETIM4 *pDateStruct = (DBDATETIM4*)pFieldInfo->pBuffer;
// convert days
long ldays = pDateStruct->numdays + 2;
double dbtime = (double)pDateStruct->nummins;
// convert time
dbtime /= (24*60); // convert minutes to DATE format
pVar->date = (double)ldays + dbtime;
}
break;
.............
default:
pVar->vt = VT_EMPTY;
ATLASSERT(false);
}
}
</PRE>
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Re: Не вижу секунд в SQL запросе

Post by uniqueman »

[quote]ETCODE retCode = dbbind(m_pDBProcess, wIndex + 1, pFieldInfo->nBindType, pFieldInfo->nLength, (BYTE *)pFieldInfo->pBuffer);

третьим параметром в этой функции всегда стоит STRINGBIND

может ли быть из за этого?
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

третьим параметром в этой функции всегда стоит STRINGBIND

может ли быть из за этого?

Если недостаточной длины char буффер, то может быть. Проверьте длину, которую Вы указываете 4-ым параметром. Я обычно стараюсь bind "родные" типы, чтобы избежать дополнительного преобразования типов.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

вот так происходит вызов

iColumnSize = dbcollen(dbSQLProcess,i);

if (iColumnSize < 32)
iColumnSize = 32;

vecValues[i] = new char[iColumnSize];

dbbind(dbSQLProcess, i, STRINGBIND, iColumnSize, (unsigned char *)vecValues[i]);
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

а могут ли быть какие то параметры при установлении соединения с базой, которые бы указывали как обрабатывать такой то тип данных? Например отсекать секунды, если имеешь дело с типом datetime... или могут ли как то date time установки на машине, где стоит софтина моя влиять как то?

Я просто в ступоре, не пойму почему отсекаются секунды.
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

1. Проверте с помощью функции
BOOL dbwillconvert (
INT srctype,
INT desttype );

может ли DB-Lib правильно конвертировать типы, в Вашем случае
DBDATETIME и DBCHAR

2. Подставьте "родной" тип для bind DATETIMEBIND как я уже советовал и если увидите в структуре DBDATETIME (указатель на которую пошлете как буффер) dttime != 0, значит проблема с конвертацией типов.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher

Return to “Вопросы и новости IT”