Поделиться через


Преобразование из C в SQL: интервалы времени дня

Идентификаторы для типов данных ODBC C дневного времени:

SQL_C_INTERVAL_DAY

SQL_C_INTERVAL_HOUR

SQL_C_INTERVAL_MINUTE

SQL_C_INTERVAL_SECOND

SQL_C_INTERVAL_DAY_TO_HOUR

SQL_C_INTERVAL_DAY_TO_MINUTE

SQL_C_INTERVAL_DAY_TO_SECOND

SQL_C_INTERVAL_HOUR_TO_MINUTE

SQL_C_INTERVAL_HOUR_TO_SECOND

SQL_C_INTERVAL_MINUTE_TO_SECOND

В следующей таблице показаны типы данных SQL ODBC, в которые могут быть преобразованы данные C интервала. Описание столбцов и терминов в таблице см. в разделе "Преобразование данных из C в типы данных SQL".

Идентификатор типа SQL Тест SQLSTATE
SQL_CHAR[a]

SQL_VARCHAR[a]

SQL_LONGVARCHAR[a]
Длина байтов столбца = длина >байтов символа

Длина байтов столбца "Длина < байтов" [a]

Значение данных не является допустимым литералом интервала
Недоступно

22001

22015
SQL_WCHAR[a]

SQL_WVARCHAR[a]

SQL_WLONGVARCHAR[a]
Длина символа столбца = длина >символов данных

Длина символа столбца для символов < данных[a]

Значение данных не является допустимым литералом интервала
Недоступно

22001

22015
SQL_TINYINT[b]

SQL_SMALLINT[b] SQL_INTEGER[b]

SQL_BIGINT[b] SQL_NUMERIC[b]

SQL_DECIMAL[b]
Преобразование интервала с одним полем не привело к усечению целых цифр

Преобразование привело к усечению целых цифр
Недоступно

22003
SQL_INTERVAL_DAY

SQL_INTERVAL_HOUR

SQL_INTERVAL_MINUTE

SQL_INTERVAL_SECOND

SQL_INTERVAL_DAY_TO_HOUR

SQL_INTERVAL_DAY_TO_MINUTE

SQL_INTERVAL_DAY_TO_SECOND

SQL_INTERVAL_HOUR_TO_MINUTE

SQL_INTERVAL_HOUR_TO_SECOND

SQL_INTERVAL_MINUTE_TO_SECOND
Значение данных было преобразовано без усечения полей

Одно или несколько полей значения данных были усечены во время преобразования
Недоступно

22015

[a] Все типы данных интервала C можно преобразовать в тип данных символов.

[b] Если поле типа в структуре интервала соответствует одному полю (SQL_DAY, SQL_HOUR, SQL_MINUTE или SQL_SECOND), тип интервала C можно преобразовать в любое точное число (SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT SQL_INTEGER, SQL_DECIMAL или SQL_NUMERIC).

Преобразование по умолчанию типа C интервала — это соответствующий тип интервала ВРЕМЕНИ SQL.

Драйвер игнорирует значение длины или индикатора при преобразовании данных из типа данных C интервала C и предполагает, что размер буфера данных — это размер типа данных C интервала C. Значение длины или индикатора передается в аргументе StrLen_or_Ind в SQLPutData и в буфере, указанном с аргументом StrLen_or_IndPtr в SQLBindParameter. Буфер данных указывается с аргументом DataPtr в SQLPutData и аргументом ParameterValuePtr в SQLBindParameter.

В следующем примере показано, как отправлять данные интервала C, хранящиеся в структуре SQL_INTERVAL_STRUCT в столбец базы данных. Структура интервала содержит интервал DAY_TO_SECOND; Он будет храниться в столбце базы данных типа SQL_INTERVAL_DAY_TO_MINUTE.

SQL_INTERVAL_STRUCT is;  
SQLINTEGER cbValue;  
  
// Initialize the interval struct to contain the DAY_TO_SECOND  
// interval "154 days, 22 hours, 44 minutes, and 10 seconds"  
is.intval.day_second.day      = 154;  
is.intval.day_second.hour     = 22;  
is.intval.day_second.minute   = 44;  
is.intval.day_second.second   = 10;  
is.interval_sign              = SQL_FALSE;  
  
// Bind the dynamic parameter  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_INTERVAL_DAY_TO_SECOND,  
                  SQL_INTERVAL_DAY_TO_MINUTE, 0, 0, &is,  
                  sizeof(SQL_INTERVAL_STRUCT), &cbValue);  
  
// Execute an insert statement; "interval_column" is a column  
// whose data type is SQL_INTERVAL_DAY_TO_MINUTE.  
SQLExecDirect(hstmt,"INSERT INTO table(interval_column) VALUES (?)",SQL_NTS);