Posted to tcl by sebres at Thu Jan 24 17:21:08 GMT 2019view raw
- sqlite3 db :memory:
- proc _int {v} {
- regsub {^\s*([+\-]?)0*(\d+)\s*$} $v {\1\2}
- }
- # ---------------------
- # check julian day:
- set i 0
- while {$i >= -210866803200} {
- set v1 [expr {[_int [clock format $i -format %J -gmt 1]] - .5}]
- set v2 [db onecolumn {select julianday(:i, 'unixepoch')}]
- if {$v1 ne $v2} {
- error "JD: tcl: $v1 ne sql: $v2, using $i"
- }
- incr i [expr {-86400*365}]
- }
- # ---------------------
- # check date-time:
- set chk_code {
- set v1 [clock format $i -format "%Y-%m-%d %H:%M:%S" -gmt 1]
- set v2 [db onecolumn {select datetime(:i, 'unixepoch')}]
- set v3 [db onecolumn {select datetime(julianday(:i, 'unixepoch'))}]
- if {$v1 ne $v2 || $v1 ne $v3} {
- error "by $i, dates: tcl: $v1 ne sql: $v2 or $v3"
- }
- }
- if {[catch {
- set i 0
- while {$i >= -210866803200} {
- if {[catch $chk_code]} {
- puts "ERROR: by $i - retry from $last with day interval"
- set i $last
- while {$i >= -210866803200} {
- if {[catch $chk_code]} {
- puts "ERROR: by $i - retry from $last with second interval"
- set i $last
- while {$i >= -210866803200} {
- eval $chk_code
- incr i -1
- }
- }
- set last $i
- incr i -86400
- }
- }
- set last $i
- incr i [expr {-86400*365}]
- }
- } msg]} {
- puts "ERROR: $msg"
- }
- # ---------------------
- puts "\nExplanation with details by check of boundaries:"
- set i $last
- if {$i > 0} {incr i -2} else {incr i 2}
- time {
- puts "\n$i ==>"
- puts tcl:\t[clock format $i -format "%Y-%m-%d %H:%M:%S" -gmt 1]
- puts sql1:\t[db onecolumn {select datetime(:i, 'unixepoch')}]
- puts sql2:\t[db onecolumn {select datetime(julianday(:i, 'unixepoch'))}]
- incr i -1
- } 5
- # ---------------------------------------
- # results to:
- # ---------------------------------------
- if 0 {;#
- ERROR: by -12235968000 - retry from -12204432000 with day interval
- ERROR: by -12219379200 - retry from -12219292800 with second interval
- ERROR: by -12219292801, dates: tcl: 1582-10-04 23:59:59 ne sql: 1582-10-14 23:59:59 or 1582-10-14 23:59:59
- Explanation with details by check of boundaries:
- -12219292798 ==>
- tcl: 1582-10-15 00:00:02
- sql1: 1582-10-15 00:00:02
- sql2: 1582-10-15 00:00:02
- -12219292799 ==>
- tcl: 1582-10-15 00:00:01
- sql1: 1582-10-15 00:00:01
- sql2: 1582-10-15 00:00:01
- -12219292800 ==>
- tcl: 1582-10-15 00:00:00
- sql1: 1582-10-15 00:00:00
- sql2: 1582-10-15 00:00:00
- -12219292801 ==>
- tcl: 1582-10-04 23:59:59
- sql1: 1582-10-14 23:59:59
- sql2: 1582-10-14 23:59:59
- -12219292802 ==>
- tcl: 1582-10-04 23:59:58
- sql1: 1582-10-14 23:59:58
- sql2: 1582-10-14 23:59:58
- };#
Comments
Posted by sebres at Thu Jan 24 19:28:32 GMT 2019 [text] [code]
This can be resolved with change of locale GREGORIAN_CHANGE_DATE to something like -0x7fffffff...