Posted to tcl by sebres at Thu Jan 24 17:21:08 GMT 2019view pretty

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...