Обсуждение: Obtaining hundredths of a second data from time data types

Поиск
Список
Период
Сортировка

Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
I am using PostgreSQL 9.5 and the 32bit PostgreSQL ODBC Driver(ANSI)
version 9.05.01.00 on Windows.

Given a table with the following create script:
create table TestTable( id integer, ts    timestamp,ts0
timestamp(0),ts1   timestamp(1),ts2   timestamp(2),ts3
timestamp(3),ts4   timestamp(4),ts5   timestamp(5),ts6 timestamp(6),t
time,t0    time(0),t1    time(1),t2    time(2),t3 time(3),t4
time(4),t5    time(5),t6    time(6),ExtraInfo char(10),constraint
TestTable_PrimaryKey primary key  (id))

I issue the following INSERT statement:

INSERT INTO TestTable (id, ts, ts0, ts1, ts2, ts3, ts4, ts5, ts6, t, t0,
t1, t2, t3, t4, t5, t6) VALUES (1, '2001-12-24 01:11:11.111111',
'2001-12-24 01:11:11', '2001-12-24 01:11:11.1', '2001-12-24
01:11:11.11', '2001-12-24 01:11:11.111', '2001-12-24 01:11:11.1111',
'2001-12-24 01:11:11.11111', '2001-12-24 01:11:11.111111',
'01:11:11.111111', '01:11:11', '01:11:11.1', '01:11:11.11',
'01:11:11.111', '01:11:11.1111', '01:11:11.11111', '01:11:11.111111')

I issue a  "SELECT * from TestTable" using SQLExecDirect.  I use
SQLBindCol to bind the timestamp and time fields to SQL_C_TIMESTAMP data
structures.  I then use SQLFetch to retrieve the data.  The timestamp
fields return the hundredths of a second information correctly, but the
time fields all return 0 for the hundredths of a second.  How can I get
the hundredths of a second values for the time fields using the
PostgreSQL ODBC Driver?

Cheers,
  Scott Ferrett



Re: Obtaining hundredths of a second data from time data types

От
Adrian Klaver
Дата:
On 03/03/2016 10:39 PM, Scott Ferrett wrote:
> I am using PostgreSQL 9.5 and the 32bit PostgreSQL ODBC Driver(ANSI)
> version 9.05.01.00 on Windows.
>
> Given a table with the following create script:
> create table TestTable( id integer, ts    timestamp,ts0
> timestamp(0),ts1   timestamp(1),ts2   timestamp(2),ts3
> timestamp(3),ts4   timestamp(4),ts5   timestamp(5),ts6 timestamp(6),t
> time,t0    time(0),t1    time(1),t2    time(2),t3 time(3),t4
> time(4),t5    time(5),t6    time(6),ExtraInfo char(10),constraint
> TestTable_PrimaryKey primary key  (id))
>
> I issue the following INSERT statement:
>
> INSERT INTO TestTable (id, ts, ts0, ts1, ts2, ts3, ts4, ts5, ts6, t, t0,
> t1, t2, t3, t4, t5, t6) VALUES (1, '2001-12-24 01:11:11.111111',
> '2001-12-24 01:11:11', '2001-12-24 01:11:11.1', '2001-12-24
> 01:11:11.11', '2001-12-24 01:11:11.111', '2001-12-24 01:11:11.1111',
> '2001-12-24 01:11:11.11111', '2001-12-24 01:11:11.111111',
> '01:11:11.111111', '01:11:11', '01:11:11.1', '01:11:11.11',
> '01:11:11.111', '01:11:11.1111', '01:11:11.11111', '01:11:11.111111')
>
> I issue a  "SELECT * from TestTable" using SQLExecDirect.  I use
> SQLBindCol to bind the timestamp and time fields to SQL_C_TIMESTAMP data
> structures.  I then use SQLFetch to retrieve the data.  The timestamp
> fields return the hundredths of a second information correctly, but the
> time fields all return 0 for the hundredths of a second.  How can I get
> the hundredths of a second values for the time fields using the
> PostgreSQL ODBC Driver?

So does is show the tenths and/or the fields after the hundredths?

Can you show the results of the SELECT query?

>
> Cheers,
>   Scott Ferrett
>
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: Obtaining hundredths of a second data from time data types

От
Adrian Klaver
Дата:
On 03/04/2016 01:20 PM, Scott Ferrett wrote:
> Here is a screen shot from ODBCTest after Issuing "SELECT ts, t FROM
> TestTable" and binding an SQL_C_TYPE_TIMESTAMP to each of the two columns:
>
>
>
> As you can see, the timestamp has the hundredths part filled in where as
> the time part does not.
>
> I also tried binding to SQL_C_CHAR as a work-around.  But this made no
> difference, producing:
>
>
>
> This is the result of the same select statement run from pgAdmin III
> showing that there the hundredths part is returned for both fields:
>
>

Looks like this is the reason:

https://msdn.microsoft.com/en-us/library/ms712436%28v=vs.85%29.aspx

The identifier for the time ODBC SQL data type is:

SQL_TYPE_TIME

to

SQL_C_TYPE_TIMESTAMP None[b] Data[c] 16[d]

[c]   The date fields of the timestamp structure are set to the current
date, and the fractional seconds field of the timestamp structure is set
to zero.


>
>
> Cheers,
>   Scott
>


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: Obtaining hundredths of a second data from time data types

От
Adrian Klaver
Дата:
On 03/05/2016 12:45 PM, Scott Ferrett wrote:
> Interesting.  It looks like PostgreSQL is conforming to the
> specification (unlike Microsoft SQL or SQL Anywhere).  However, it does
> not help me with the underlying problem and that is "How do I get the
> fractional part of a TIME field via ODBC?".
>
> I have tried SQL_C_TYPE_TIMSTAMP, SQL_C_TYPE_CHAR and
> SQL_C_TYPE_DEFAULT.  None of these return the fractional part of the
> time field.  I've also tries SQL_C_TYPE_BINARY and get an error
> szSqlState = "07006", *pfNativeError = 14, *pcbErrorMsg = 43,
> MessageText = "Received an unsupported type from Postgres."
>
> So how can I get the fractional information?

Use?:

SQL_C_TYPE_TIME

>
> Note that I do not have any control of the SQL statement.  My code needs
> to handle any statement and return all information about the query.
>
> Cheers,
>   Scott
>
> On 05/03/2016 09:03, Adrian Klaver wrote:
>> On 03/04/2016 01:20 PM, Scott Ferrett wrote:
>>> Here is a screen shot from ODBCTest after Issuing "SELECT ts, t FROM
>>> TestTable" and binding an SQL_C_TYPE_TIMESTAMP to each of the two
>>> columns:
>>>
>>>
>>>
>>> As you can see, the timestamp has the hundredths part filled in where as
>>> the time part does not.
>>>
>>> I also tried binding to SQL_C_CHAR as a work-around.  But this made no
>>> difference, producing:
>>>
>>>
>>>
>>> This is the result of the same select statement run from pgAdmin III
>>> showing that there the hundredths part is returned for both fields:
>>>
>>>
>>
>> Looks like this is the reason:
>>
>> https://msdn.microsoft.com/en-us/library/ms712436%28v=vs.85%29.aspx
>>
>> The identifier for the time ODBC SQL data type is:
>>
>> SQL_TYPE_TIME
>>
>> to
>>
>> SQL_C_TYPE_TIMESTAMP None[b] Data[c] 16[d]
>>
>> [c]   The date fields of the timestamp structure are set to the
>> current date, and the fractional seconds field of the timestamp
>> structure is set to zero.
>>
>>
>>>
>>>
>>> Cheers,
>>>   Scott
>>>
>>
>>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: Obtaining hundredths of a second data from time data types

От
Adrian Klaver
Дата:
On 03/06/2016 05:49 PM, Scott Ferrett wrote:
> SQL_C_TYPE_TIME is defined as
>
> struct tagTIME_STRUCT {
>     SQLUSMALLINT hour;
>     SQLUSMALLINT minute;
>     SQLUSMALLINT second;
> } TIME_STRUCT;
>
>
> There is no fraction of a second component.
>

Hmm, then I am at a loss for answer.


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
Interesting.  It looks like PostgreSQL is conforming to the
specification (unlike Microsoft SQL or SQL Anywhere).  However, it does
not help me with the underlying problem and that is "How do I get the
fractional part of a TIME field via ODBC?".

I have tried SQL_C_TYPE_TIMSTAMP, SQL_C_TYPE_CHAR and
SQL_C_TYPE_DEFAULT.  None of these return the fractional part of the
time field.  I've also tries SQL_C_TYPE_BINARY and get an error
szSqlState = "07006", *pfNativeError = 14, *pcbErrorMsg = 43,
MessageText = "Received an unsupported type from Postgres."

So how can I get the fractional information?

Note that I do not have any control of the SQL statement.  My code needs
to handle any statement and return all information about the query.

Cheers,
  Scott

On 05/03/2016 09:03, Adrian Klaver wrote:
> On 03/04/2016 01:20 PM, Scott Ferrett wrote:
>> Here is a screen shot from ODBCTest after Issuing "SELECT ts, t FROM
>> TestTable" and binding an SQL_C_TYPE_TIMESTAMP to each of the two
>> columns:
>>
>>
>>
>> As you can see, the timestamp has the hundredths part filled in where as
>> the time part does not.
>>
>> I also tried binding to SQL_C_CHAR as a work-around.  But this made no
>> difference, producing:
>>
>>
>>
>> This is the result of the same select statement run from pgAdmin III
>> showing that there the hundredths part is returned for both fields:
>>
>>
>
> Looks like this is the reason:
>
> https://msdn.microsoft.com/en-us/library/ms712436%28v=vs.85%29.aspx
>
> The identifier for the time ODBC SQL data type is:
>
> SQL_TYPE_TIME
>
> to
>
> SQL_C_TYPE_TIMESTAMP None[b] Data[c] 16[d]
>
> [c]   The date fields of the timestamp structure are set to the
> current date, and the fractional seconds field of the timestamp
> structure is set to zero.
>
>
>>
>>
>> Cheers,
>>   Scott
>>
>
>



Re: Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
Here is a screen shot from ODBCTest after Issuing "SELECT ts, t FROM TestTable" and binding an SQL_C_TYPE_TIMESTAMP to each of the two columns:



As you can see, the timestamp has the hundredths part filled in where as the time part does not.

I also tried binding to SQL_C_CHAR as a work-around.  But this made no difference, producing:



This is the result of the same select statement run from pgAdmin III showing that there the hundredths part is returned for both fields:




Cheers,
 Scott

On 05/03/2016 05:19, Adrian Klaver wrote:
On 03/03/2016 10:39 PM, Scott Ferrett wrote:
I am using PostgreSQL 9.5 and the 32bit PostgreSQL ODBC Driver(ANSI)
version 9.05.01.00 on Windows.

Given a table with the following create script:
create table TestTable( id integer, ts    timestamp,ts0
timestamp(0),ts1   timestamp(1),ts2   timestamp(2),ts3
timestamp(3),ts4   timestamp(4),ts5   timestamp(5),ts6 timestamp(6),t
time,t0    time(0),t1    time(1),t2    time(2),t3 time(3),t4
time(4),t5    time(5),t6    time(6),ExtraInfo char(10),constraint
TestTable_PrimaryKey primary key  (id))

I issue the following INSERT statement:

INSERT INTO TestTable (id, ts, ts0, ts1, ts2, ts3, ts4, ts5, ts6, t, t0,
t1, t2, t3, t4, t5, t6) VALUES (1, '2001-12-24 01:11:11.111111',
'2001-12-24 01:11:11', '2001-12-24 01:11:11.1', '2001-12-24
01:11:11.11', '2001-12-24 01:11:11.111', '2001-12-24 01:11:11.1111',
'2001-12-24 01:11:11.11111', '2001-12-24 01:11:11.111111',
'01:11:11.111111', '01:11:11', '01:11:11.1', '01:11:11.11',
'01:11:11.111', '01:11:11.1111', '01:11:11.11111', '01:11:11.111111')

I issue a  "SELECT * from TestTable" using SQLExecDirect.  I use
SQLBindCol to bind the timestamp and time fields to SQL_C_TIMESTAMP data
structures.  I then use SQLFetch to retrieve the data.  The timestamp
fields return the hundredths of a second information correctly, but the
time fields all return 0 for the hundredths of a second.  How can I get
the hundredths of a second values for the time fields using the
PostgreSQL ODBC Driver?

So does is show the tenths and/or the fields after the hundredths?

Can you show the results of the SELECT query?


Cheers,
  Scott Ferrett






Вложения

Re: Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
SQL_C_TYPE_TIME is defined as

struct tagTIME_STRUCT {
    SQLUSMALLINT hour;
    SQLUSMALLINT minute;
    SQLUSMALLINT second;
} TIME_STRUCT;


There is no fraction of a second component.

On 06/03/2016 10:07, Adrian Klaver wrote:
> On 03/05/2016 12:45 PM, Scott Ferrett wrote:
>> Interesting.  It looks like PostgreSQL is conforming to the
>> specification (unlike Microsoft SQL or SQL Anywhere).  However, it does
>> not help me with the underlying problem and that is "How do I get the
>> fractional part of a TIME field via ODBC?".
>>
>> I have tried SQL_C_TYPE_TIMSTAMP, SQL_C_TYPE_CHAR and
>> SQL_C_TYPE_DEFAULT.  None of these return the fractional part of the
>> time field.  I've also tries SQL_C_TYPE_BINARY and get an error
>> szSqlState = "07006", *pfNativeError = 14, *pcbErrorMsg = 43,
>> MessageText = "Received an unsupported type from Postgres."
>>
>> So how can I get the fractional information?
>
> Use?:
>
> SQL_C_TYPE_TIME
>
>>
>> Note that I do not have any control of the SQL statement.  My code needs
>> to handle any statement and return all information about the query.
>>
>> Cheers,
>>   Scott
>>
>> On 05/03/2016 09:03, Adrian Klaver wrote:
>>> On 03/04/2016 01:20 PM, Scott Ferrett wrote:
>>>> Here is a screen shot from ODBCTest after Issuing "SELECT ts, t FROM
>>>> TestTable" and binding an SQL_C_TYPE_TIMESTAMP to each of the two
>>>> columns:
>>>>
>>>>
>>>>
>>>> As you can see, the timestamp has the hundredths part filled in
>>>> where as
>>>> the time part does not.
>>>>
>>>> I also tried binding to SQL_C_CHAR as a work-around.  But this made no
>>>> difference, producing:
>>>>
>>>>
>>>>
>>>> This is the result of the same select statement run from pgAdmin III
>>>> showing that there the hundredths part is returned for both fields:
>>>>
>>>>
>>>
>>> Looks like this is the reason:
>>>
>>> https://msdn.microsoft.com/en-us/library/ms712436%28v=vs.85%29.aspx
>>>
>>> The identifier for the time ODBC SQL data type is:
>>>
>>> SQL_TYPE_TIME
>>>
>>> to
>>>
>>> SQL_C_TYPE_TIMESTAMP None[b] Data[c] 16[d]
>>>
>>> [c]   The date fields of the timestamp structure are set to the
>>> current date, and the fractional seconds field of the timestamp
>>> structure is set to zero.
>>>
>>>
>>>>
>>>>
>>>> Cheers,
>>>>   Scott
>>>>
>>>
>>>
>>
>
>



Re: Obtaining hundredths of a second data from time data types

От
"Inoue, Hiroshi"
Дата:
Hi Scott,

Could you try the test drivers 9.5.0104 at
http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/
?

regards,
Hiroshi Inoue

On 2016/03/04 15:39, Scott Ferrett wrote:
> I am using PostgreSQL 9.5 and the 32bit PostgreSQL ODBC Driver(ANSI)
> version 9.05.01.00 on Windows.
>
> Given a table with the following create script:
> create table TestTable( id integer, ts    timestamp,ts0
> timestamp(0),ts1   timestamp(1),ts2   timestamp(2),ts3
> timestamp(3),ts4   timestamp(4),ts5   timestamp(5),ts6 timestamp(6),t
> time,t0    time(0),t1    time(1),t2    time(2),t3 time(3),t4
> time(4),t5    time(5),t6    time(6),ExtraInfo char(10),constraint
> TestTable_PrimaryKey primary key  (id))
>
> I issue the following INSERT statement:
>
> INSERT INTO TestTable (id, ts, ts0, ts1, ts2, ts3, ts4, ts5, ts6, t,
> t0, t1, t2, t3, t4, t5, t6) VALUES (1, '2001-12-24 01:11:11.111111',
> '2001-12-24 01:11:11', '2001-12-24 01:11:11.1', '2001-12-24
> 01:11:11.11', '2001-12-24 01:11:11.111', '2001-12-24 01:11:11.1111',
> '2001-12-24 01:11:11.11111', '2001-12-24 01:11:11.111111',
> '01:11:11.111111', '01:11:11', '01:11:11.1', '01:11:11.11',
> '01:11:11.111', '01:11:11.1111', '01:11:11.11111', '01:11:11.111111')
>
> I issue a  "SELECT * from TestTable" using SQLExecDirect.  I use
> SQLBindCol to bind the timestamp and time fields to SQL_C_TIMESTAMP
> data structures.  I then use SQLFetch to retrieve the data.  The
> timestamp fields return the hundredths of a second information
> correctly, but the time fields all return 0 for the hundredths of a
> second.  How can I get the hundredths of a second values for the time
> fields using the PostgreSQL ODBC Driver?
>
> Cheers,
>  Scott Ferrett



Re: Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
Hi Hiroshi,

This driver fixes all the problems with retrieving data.  Thank you.

This allowed me to get further with my testing and found the next problem.

Although you can now retrieve data using SQLBindCol, you cannot insert
of update data using SQLBindParameter.

If you issue an INSERT INTO TestTable (ID,T) VALUES (?,?) and use
SQLBindParameter to bind an SQL_C_TIMESTAMP structure to the second
parameter, then the new row is inserted with the fractional part truncated.

Cheers,
  Scott

On 08/03/2016 23:37, Inoue, Hiroshi wrote:
> Hi Scott,
>
> Could you try the test drivers 9.5.0104 at
> http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/
> ?
>
> regards,
> Hiroshi Inoue
>
> On 2016/03/04 15:39, Scott Ferrett wrote:
>> I am using PostgreSQL 9.5 and the 32bit PostgreSQL ODBC Driver(ANSI)
>> version 9.05.01.00 on Windows.
>>
>> Given a table with the following create script:
>> create table TestTable( id integer, ts    timestamp,ts0
>> timestamp(0),ts1   timestamp(1),ts2   timestamp(2),ts3
>> timestamp(3),ts4   timestamp(4),ts5   timestamp(5),ts6 timestamp(6),t
>> time,t0    time(0),t1    time(1),t2    time(2),t3 time(3),t4
>> time(4),t5    time(5),t6    time(6),ExtraInfo char(10),constraint
>> TestTable_PrimaryKey primary key  (id))
>>
>> I issue the following INSERT statement:
>>
>> INSERT INTO TestTable (id, ts, ts0, ts1, ts2, ts3, ts4, ts5, ts6, t,
>> t0, t1, t2, t3, t4, t5, t6) VALUES (1, '2001-12-24 01:11:11.111111',
>> '2001-12-24 01:11:11', '2001-12-24 01:11:11.1', '2001-12-24
>> 01:11:11.11', '2001-12-24 01:11:11.111', '2001-12-24 01:11:11.1111',
>> '2001-12-24 01:11:11.11111', '2001-12-24 01:11:11.111111',
>> '01:11:11.111111', '01:11:11', '01:11:11.1', '01:11:11.11',
>> '01:11:11.111', '01:11:11.1111', '01:11:11.11111', '01:11:11.111111')
>>
>> I issue a  "SELECT * from TestTable" using SQLExecDirect.  I use
>> SQLBindCol to bind the timestamp and time fields to SQL_C_TIMESTAMP
>> data structures.  I then use SQLFetch to retrieve the data.  The
>> timestamp fields return the hundredths of a second information
>> correctly, but the time fields all return 0 for the hundredths of a
>> second.  How can I get the hundredths of a second values for the time
>> fields using the PostgreSQL ODBC Driver?
>>
>> Cheers,
>>  Scott Ferrett
>
>



Re: Obtaining hundredths of a second data from time data types

От
"Inoue, Hiroshi"
Дата:
Hi Scott,

On 2016/03/09 9:34, Scott Ferrett wrote:
> Hi Hiroshi,
>
> This driver fixes all the problems with retrieving data.  Thank you.
>
> This allowed me to get further with my testing and found the next
> problem.
>
> Although you can now retrieve data using SQLBindCol, you cannot insert
> of update data using SQLBindParameter.
>
> If you issue an INSERT INTO TestTable (ID,T) VALUES (?,?) and use
> SQLBindParameter to bind an SQL_C_TIMESTAMP structure to the second
> parameter, then the new row is inserted with the fractional part
> truncated.

Please try the test drivers 9.5.0105 at
  http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/
.

regards,
Hiroshi Inoue


Re: Obtaining hundredths of a second data from time data types

От
Scott Ferrett
Дата:
Hi Hiroshi,

That driver passed all my tests.  Thanks.

Cheers,
  Scott

On 09/03/2016 21:24, Inoue, Hiroshi wrote:
> Hi Scott,
>
> On 2016/03/09 9:34, Scott Ferrett wrote:
>> Hi Hiroshi,
>>
>> This driver fixes all the problems with retrieving data.  Thank you.
>>
>> This allowed me to get further with my testing and found the next
>> problem.
>>
>> Although you can now retrieve data using SQLBindCol, you cannot
>> insert of update data using SQLBindParameter.
>>
>> If you issue an INSERT INTO TestTable (ID,T) VALUES (?,?) and use
>> SQLBindParameter to bind an SQL_C_TIMESTAMP structure to the second
>> parameter, then the new row is inserted with the fractional part
>> truncated.
>
> Please try the test drivers 9.5.0105 at
>  http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/
> .
>
> regards,
> Hiroshi Inoue
>