2016-05-03 11 views
1

私はAccessデータベースから取得しているタイムスタンプを持っています。残念ながら、タイムスタンプは時刻のみを表しますが、1899-12-30 13:05:00 +0000として保存されます。日付部分は別のフィールドにあります。私はjsonブロブに格納している間、できるだけ多くのデータを保持する必要があります。Ojタイムダンプ - LinuxとWindowsの違い

私はjsonにデータをダンプするためにOj(すばらしいです)を使用しています。私は、Windowsプラットフォーム上で次の動作が発生した:

irb(main):001:0> require 'oj' 
=> true 
irb(main):002:0> t = Time.new(1899,12,30,13,5,0) #this is my actual timestamp 
=> 1899-12-30 13:05:00 +0000 
irb(main):003:0> Oj.dump(t) 
RangeError: bignum too big to convert into `long' 
     from (irb):3:in `dump' 
     from (irb):3 
     from C:/RailsInstaller/Ruby2.2.0/bin/irb:11:in `<main>' 
irb(main):004:0> 

さて、Linux上:

2.3.0 :001 > require 'oj' 
=> true 
2.3.0 :002 > t = Time.new(1899,12,30,13,5,0) 
=> 1899-12-30 13:05:00 +0000 
2.3.0 :003 > Oj.dump(t) 
=> "{\"^t\":-2209114500.000000000e0}" 

は私のソース・データベースがMSアクセスであるので、Windows上でこの作業を行う必要があります。助けてください。

+0

あなたは、Accessデータベースからの時間列を取得することができます'1899-12-30 13:05:00'の代わりに' 0.545138888888889'を返す、 'SELECT CDbl(TimeValue)AS DayFraction FROM tblTimes'のように、DateTimeの代わりにDoubleとして使用しますか? –

+0

それはいい考えですが、私はテーブルがたくさんあり、さらにこれらのフィールドの多くを持っています。私はテーブルごとにカスタム 'SELECT'を書いてはいけません。 Sequelの 'db [:table] .all'は素晴らしいです。今まで私はあきらめました。各レコードの 'Time'値ごとにブルートテスト' Oj.dump'を行い、失敗した場合は71年追加しています。エレガントではありませんが、動作し、十分に速いです。 – avguchenko

+1

これは32/64bitの問題ですか?最小符号長は(-1)* 2^31または-2147483648です。あなたの価値は-2209114500であり、できるだけ薄いものよりも小さい。 – BitAccesser

答えて

0

時間は正しく処理されませんが、floatに変換できます。結果の文字列は、元から少し異なります

irb(main):001:0> require 'oj' 
=> true 
irb(main):002:0> t = Time.new(1899,12,30,13,5,0) 
=> 1899-12-30 13:05:00 +0100 
irb(main):003:0> Oj.dump(t) 
RangeError: bignum too big to convert into `long' 
    from (irb):3:in `dump' 
    from (irb):3 
    from C:/Ruby23-x64/bin/irb.cmd:19:in `<main>' 
irb(main):005:0> Oj.dump(t.to_f) 
=> "-2209118100.0" 

それとも、正確な応答が必要な場合は、配列を使用することができます

irb(main):001:0> require 'oj' 
=> true 
irb(main):002:0> t = Time.new(1899,12,30,13,5,0) 
=> 1899-12-30 13:05:00 +0100 
irb(main):012:0> A1 = Array.new(1) 
=> [nil] 
irb(main):017:0> A1[0] = '^t' 
=> "^t" 
irb(main):028:0> A1[1] = t.to_f 
=> "-2209118100.0" 
irb(main):035:0> Oj.dump(A1).tr("[","{").tr("]","}") 
=> "{\"^t\",\"-2209118100.0\"}" 
関連する問題