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

  1. sqlite3 db :memory:
  2.  
  3. proc _int {v} {
  4. regsub {^\s*([+\-]?)0*(\d+)\s*$} $v {\1\2}
  5. }
  6.  
  7. # ---------------------
  8.  
  9. # check julian day:
  10. set i 0
  11. while {$i >= -210866803200} {
  12. set v1 [expr {[_int [clock format $i -format %J -gmt 1]] - .5}]
  13. set v2 [db onecolumn {select julianday(:i, 'unixepoch')}]
  14. if {$v1 ne $v2} {
  15. error "JD: tcl: $v1 ne sql: $v2, using $i"
  16. }
  17. incr i [expr {-86400*365}]
  18. }
  19.  
  20. # ---------------------
  21.  
  22. # check date-time:
  23. set chk_code {
  24. set v1 [clock format $i -format "%Y-%m-%d %H:%M:%S" -gmt 1]
  25. set v2 [db onecolumn {select datetime(:i, 'unixepoch')}]
  26. set v3 [db onecolumn {select datetime(julianday(:i, 'unixepoch'))}]
  27. if {$v1 ne $v2 || $v1 ne $v3} {
  28. error "by $i, dates: tcl: $v1 ne sql: $v2 or $v3"
  29. }
  30. }
  31. if {[catch {
  32. set i 0
  33. while {$i >= -210866803200} {
  34. if {[catch $chk_code]} {
  35. puts "ERROR: by $i - retry from $last with day interval"
  36. set i $last
  37. while {$i >= -210866803200} {
  38. if {[catch $chk_code]} {
  39. puts "ERROR: by $i - retry from $last with second interval"
  40. set i $last
  41. while {$i >= -210866803200} {
  42. eval $chk_code
  43. incr i -1
  44. }
  45. }
  46. set last $i
  47. incr i -86400
  48. }
  49. }
  50. set last $i
  51. incr i [expr {-86400*365}]
  52. }
  53. } msg]} {
  54. puts "ERROR: $msg"
  55. }
  56.  
  57. # ---------------------
  58.  
  59. puts "\nExplanation with details by check of boundaries:"
  60. set i $last
  61. if {$i > 0} {incr i -2} else {incr i 2}
  62. time {
  63. puts "\n$i ==>"
  64. puts tcl:\t[clock format $i -format "%Y-%m-%d %H:%M:%S" -gmt 1]
  65. puts sql1:\t[db onecolumn {select datetime(:i, 'unixepoch')}]
  66. puts sql2:\t[db onecolumn {select datetime(julianday(:i, 'unixepoch'))}]
  67. incr i -1
  68. } 5
  69.  
  70. # ---------------------------------------
  71. # results to:
  72. # ---------------------------------------
  73. if 0 {;#
  74. ERROR: by -12235968000 - retry from -12204432000 with day interval
  75. ERROR: by -12219379200 - retry from -12219292800 with second interval
  76. 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
  77.  
  78. Explanation with details by check of boundaries:
  79.  
  80. -12219292798 ==>
  81. tcl: 1582-10-15 00:00:02
  82. sql1: 1582-10-15 00:00:02
  83. sql2: 1582-10-15 00:00:02
  84.  
  85. -12219292799 ==>
  86. tcl: 1582-10-15 00:00:01
  87. sql1: 1582-10-15 00:00:01
  88. sql2: 1582-10-15 00:00:01
  89.  
  90. -12219292800 ==>
  91. tcl: 1582-10-15 00:00:00
  92. sql1: 1582-10-15 00:00:00
  93. sql2: 1582-10-15 00:00:00
  94.  
  95. -12219292801 ==>
  96. tcl: 1582-10-04 23:59:59
  97. sql1: 1582-10-14 23:59:59
  98. sql2: 1582-10-14 23:59:59
  99.  
  100. -12219292802 ==>
  101. tcl: 1582-10-04 23:59:58
  102. sql1: 1582-10-14 23:59:58
  103. sql2: 1582-10-14 23:59:58
  104. };#

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