В таблице есть колонка с типом datetime.
Когда я выполняю SQL запрос в самой базе и хочу посмотреть данные этой колонки, то данные возвращаются полностью в формате "dd mm yy hh:mm:ss"
а когда пытаюсь выполнить тот тже самый запрос в приложении, то данные возвращаются БЕЗ секунд. В каком месте смотреть?
Интерфейс - DB-Library for C
Спасибо
Не вижу секунд в SQL запросе
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
Не вижу секунд в SQL запросе
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
- Спасибо, мы уже пиво выпили
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
-
- Уже с Приветом
- Posts: 707
- Joined: 12 Mar 2003 22:29
- Location: Moscow->Bay Area, CA
Re: Не вижу секунд в SQL запросе
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
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
Re: Не вижу секунд в SQL запросе
[quote]ETCODE retCode = dbbind(m_pDBProcess, wIndex + 1, pFieldInfo->nBindType, pFieldInfo->nLength, (BYTE *)pFieldInfo->pBuffer);
третьим параметром в этой функции всегда стоит STRINGBIND
может ли быть из за этого?
третьим параметром в этой функции всегда стоит STRINGBIND
может ли быть из за этого?
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
- Спасибо, мы уже пиво выпили
-
- Уже с Приветом
- Posts: 707
- Joined: 12 Mar 2003 22:29
- Location: Moscow->Bay Area, CA
третьим параметром в этой функции всегда стоит STRINGBIND
может ли быть из за этого?
Если недостаточной длины char буффер, то может быть. Проверьте длину, которую Вы указываете 4-ым параметром. Я обычно стараюсь bind "родные" типы, чтобы избежать дополнительного преобразования типов.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
а могут ли быть какие то параметры при установлении соединения с базой, которые бы указывали как обрабатывать такой то тип данных? Например отсекать секунды, если имеешь дело с типом datetime... или могут ли как то date time установки на машине, где стоит софтина моя влиять как то?
Я просто в ступоре, не пойму почему отсекаются секунды.
Я просто в ступоре, не пойму почему отсекаются секунды.
- Чай, кофе не предлагаю...
- Спасибо, мы уже пиво выпили
- Спасибо, мы уже пиво выпили
-
- Уже с Приветом
- Posts: 707
- Joined: 12 Mar 2003 22:29
- Location: Moscow->Bay Area, CA
1. Проверте с помощью функции
BOOL dbwillconvert (
INT srctype,
INT desttype );
может ли DB-Lib правильно конвертировать типы, в Вашем случае
DBDATETIME и DBCHAR
2. Подставьте "родной" тип для bind DATETIMEBIND как я уже советовал и если увидите в структуре DBDATETIME (указатель на которую пошлете как буффер) dttime != 0, значит проблема с конвертацией типов.
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