How do sql databases and drivers handle Date columns
I usually get confused when handling date datatype with databases, especially when connecting to the databases via libraries/drivers.
In this post, I will summarize the results of their specification after my tests.
Environment:
- Node:
v16.0.0
. - Postgres nodejs driver:
pg@8.6.0
. - Mysqlite nodejs driver:
sqlite3@5.0.2
. - Knex query builder:
knex@0.95.6
. - Postgres server:
13.0
.
With SQLite
Type definition
SQLite data types reference can be referred from here.
The type used in the test: datetime
.
Test result
Set type | Get type | Sample set | Sample get |
---|---|---|---|
number |
number |
1622361110420 |
1622361110420 |
ISO 8601 string | ISO 8601 string | "2021-05-30T07:51:50.420Z" |
"2021-05-30T07:51:50.420Z" |
Native Date object |
string |
new Date(1622361110420) |
"Sun May 30 2021 16:51:50 GMT+0900 (Japan Standard Time)" |
With PostgreSQL
Type definition
Postgres date type definition and specification can be found here.
Column type used in the test: timestampz(6)
(timestamp with 6 digits precision with time zone information included).
Test result
Set type | Get type | Sample set | Sample get |
---|---|---|---|
number (error) |
n/a | 1622361110420 . error: date/time field value out of range: "1622361110420" |
n/a |
ISO 8601 string | Native Date object |
"2021-05-30T07:51:50.420Z" |
Native Date object |
Native Date Object |
Native Date object |
new Date(1622361110420) |
Native Date object |
For parsing data from database
to customize the bound types, use pg-types
package. There is a list of type ids defined here. TIMESTAMP (1114) and TIMESTAMPZ (1184) are associated with the native parser here.
For serializing data to pass to query
This logic is, in fact, irrelevant to the data parser. pg
package has a special check on the native Date object.
if (val instanceof Date) {
if (defaults.parseInputDatesAsUTC) {
return dateToStringUTC(val)
} else {
return dateToString(val)
}
}
The pg
package has its own version of Date object serialization namely dateToStringUTC
and dateToString
, and use one of them depending on whether the parseInputDatesAsUTC
option is used. Note that this option is not officially documented.