PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रेल में अनंत समय सीमा के साथ समस्याएं

आप इन्फिनिटी को रेल में समय सीमा के हिस्से के रूप में स्टोर नहीं कर सकते हैं। मेरा मानना ​​​​है कि ऐसा इसलिए है क्योंकि इन्फिनिटी को एक स्ट्रिंग मान के रूप में डाला जा रहा है और मूल पीएसक्यूएल ओआईडी से निकाले जाने पर फ्लोट के रूप में व्याख्या की जाती है। तो, दिनांक -> फ़्लोट से कोई भी दिनांक सीमा व्यवहार्य नहीं होगी। लेकिन आप छद्म (अब से 1 मिलियन वर्ष) तिथियों के साथ अपनी खुद की सीमा बनाने का प्रबंधन कर सकते हैं या आप केवल दो अलग-अलग दिनांक फ़ील्ड का उपयोग कर सकते हैं और मॉडल में उनकी उचित व्याख्या कर सकते हैं। आरंभ तिथि, समाप्ति तिथि।

रेल 4.2+ में, आप अपने डेटाटाइम प्रकार के अंदर एक फ्लोट ::इन्फिनिटी मान स्टोर कर सकते हैं। उदाहरण।

User.first.update(begin_date: DateTime.now, end_date: 'infinity')
User.first.end_date # => Infinity

हालांकि, end_date वैध तिथि नहीं होगी। आप बस स्ट्रिंग . को स्टोर कर रहे हैं डेटाबेस में और आप एक फ्लोट . निकाल रहे हैं जब आप इसे कॉल करते हैं।

यहां वास्तविक (रेल 4.2) कोड है जो इसे संभालता है:

module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module OID # :nodoc:
        class DateTime < Type::DateTime # :nodoc:
          include Infinity

          def type_cast_for_database(value)
            if has_precision? && value.acts_like?(:time) && value.year <= 0
              bce_year = format("%04d", -value.year + 1)
              super.sub(/^-?\d+/, bce_year) + " BC"
            else
              super
            end
          end

          def cast_value(value)
            if value.is_a?(::String)
              case value
              when 'infinity' then ::Float::INFINITY
              when '-infinity' then -::Float::INFINITY
              when / BC$/
                astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
                super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
              else
                super
              end
            else
              value
            end
          end
        end
      end
    end
  end
end

दोबारा, आप नहीं एक फ्लोट के साथ दिनांक समय तुलना करने में सक्षम हो। लेकिन, इन दो मानों -::Float::INFINITY के लिए एक विशेष मामला होना शायद काफी आसान है और ::Float::INFINITY




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कर्सर.execute(im_entry.test (+entrym+) VALUES ('+p+');)

  2. पोस्टग्रेज सांख्यिक प्रकारों पर csv फ़ाइलें आयात करें

  3. psycopg2 - बिना चाबी वाला कनेक्शन

  4. Pgadmin लोड नहीं हो रहा है

  5. क्या मैं pg_restore कमांड को निष्पादित करते समय db को छोड़ और बना सकता हूँ?