create table
CREATE TABLE `temporal_datatype` (
`classification` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
`date` date DEFAULT NULL,
`datetime` datetime(6) DEFAULT NULL,
`timestamp` timestamp(6) NULL DEFAULT NULL,
`time` time(6) DEFAULT NULL,
`year` year DEFAULT NULL
)
insert values
zero, min, max values for temporal datatype
MySQL Doc: Temporal Types
| class |
date |
datetime |
timestamp |
time |
year |
| zero |
‘0000-00-00’ |
‘0000-00-00 00:00:00.000000’ |
‘0000-00-00 00:00:00.000000’ |
‘000:00:00.000000’ |
‘0000’ |
| min |
‘1000-01-01’ |
‘1000-01-01 00:00:00.000000’ |
‘1970-01-01 00:00:01.000000’ |
‘-838:59:59.000000’ |
‘1901’ |
| max |
‘9999-12-31’ |
‘9999-12-31 23:59:59.999999’ |
‘2038-01-19 03:14:07.999999’ |
‘838:59:59.000000’ |
‘2155’ |
check before insert
sql_mode for zero value
MySQL Doc: no_zero_date, no_zero_in_date
Inserting zero values is possible only if no_zero_date and no_zero_in_date disabled in sql_mode.
Set sql_mode to exclude above two values.
SET GLOBAL `sql_mode` = '';
time_zone for min, max value
Datatype range is applies only to UTC.
Set time_zone to UTC or apply time difference to get the correct min/max value for the current time_zone.
SET GLOBAL `time_zone` = 'UTC';
insert
Insert zero, min, max values for each temporal datatype.
INSERT INTO `temporal` VALUES('zero', '0000-00-00', '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000', '000:00:00.000000', '0000');
INSERT INTO `temporal` VALUES('min', '1000-01-01', '1000-01-01 00:00:00.000000', '1970-01-01 00:00:01.000000', '-838:59:59.000000', '1901');
INSERT INTO `temporal` VALUES('max', '9999-12-31', '9999-12-31 23:59:59.999999', '2038-01-19 03:14:07.999999', '838:59:59.000000', '2155');
get values using Python library
| class |
DATE |
DATETIME |
TIMESTAMP |
TIME |
YEAR |
| zero |
<class ‘str’> 0000-00-00 |
<class ‘str’> 0000-00-00 00:00:00.000000 |
<class ‘str’> 0000-00-00 00:00:00.000000 |
<class ‘datetime.timedelta’> 0:00:00 |
<class ‘int’> 0 |
| min |
<class ‘datetime.date’> 1000-01-01 |
<class ‘datetime.datetime’> 1000-01-01 00:00:00 |
<class ‘datetime.datetime’> 1970-01-01 00:00:01 |
<class ‘datetime.timedelta’> -35 days, 1:00:01 |
<class ‘int’> 1901 |
| max |
<class ‘datetime.date’> 9999-12-31 |
<class ‘datetime.datetime’> 9999-12-31 23:59:59.999999 |
<class ‘datetime.datetime’> 2038-01-19 03:14:07.999999 |
<class ‘datetime.timedelta’> 34 days, 22:59:59 |
<class ‘int’> 2155 |
| class |
DATE |
DATETIME |
TIMESTAMP |
TIME |
YEAR |
| zero |
<class ‘NoneType’> None |
<class ‘NoneType’> None |
<class ‘datetime.datetime’> 1970-01-01 09:00:00 |
<class ‘datetime.timedelta’> 0:00:00 |
<class ‘int’> 1900 |
| min |
<class ‘datetime.date’> 1000-01-01 |
<class ‘datetime.datetime’> 1000-01-01 00:00:00 |
<class ‘datetime.datetime’> 1970-01-01 09:00:01 |
<class ‘datetime.timedelta’> -35 days, 2:59:59 |
<class ‘int’> 1901 |
| max |
<class ‘datetime.date’> 9999-12-31 |
<class ‘datetime.datetime’> 9999-12-31 23:59:59.999999 |
<class ‘datetime.datetime’> 2038-01-19 12:14:07.999999 |
<class ‘datetime.timedelta’> 34 days, 22:59:59 |
<class ‘int’> 2155 |
difference analysis
zero DATE & DATETIME
| library |
class |
exception |
return value |
| pymysql |
datetime.date(), datetime() |
ValueError |
returns obj as it is (string) |
| pymysqlreplication |
datetime.date(), datetime() |
ValueError |
returns None |
zero TIMESTAMP
| library |
class |
exception |
return value |
timedelta applied |
| pymysql |
datetime.datetime() |
ValueError |
returns obj as it is (string) |
N/A |
| pymysqlreplication |
datetime.datetime.fromtimestamp() |
N/A |
‘1970-01-01 09:00:00’ |
+09:00 (‘Asia/Seoul’) |
min TIME
| library |
return value |
| pymysql |
-838 hours, -59 minutes, -59 seconds (correct) |
| pymysqlreplication |
-838 hours, +59 minutes, +59 seconds (wrong) |
Created pull request to correct TIME values for pymysqlreplication