পোস্টগ্রেসের সাহায্যে আমি কীভাবে একটি অন্তরকে কয়েক ঘন্টার মধ্যে রূপান্তর করব?


161

বলুন আমার মত একটি অন্তর আছে

4 days 10:00:00

পোস্টগ্রিসে। আমি কীভাবে এটিকে কয়েক ঘন্টার মধ্যে রূপান্তর করব (এই ক্ষেত্রে 106?) কোনও ফাংশন আছে বা আমার বুলেটটি কামড়ানো উচিত এবং এর মতো কিছু করা উচিত

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
দ্রষ্টব্য: যদি আপনার বিরতিতে কয়েক মাস বা বছর থাকে তবে একটি মাস বা বছরের দিনগুলির সংখ্যা পৃথক হওয়ার কারণে সেখানে কত ঘন্টা রয়েছে তার কোনও সংজ্ঞায়িত উত্তর নেই। সুতরাং যে জন্য নজর রাখুন!
টেডি

উত্তর:


313

সম্ভবত সবচেয়ে সহজ উপায়:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
এবং সম্ভবত মেঝেতে বা ফলাফলটি পূর্ণসংখ্যায় ফেলে দিতে পারে যদি বিরতিতে কয়েক মিনিট এবং / অথবা সেকেন্ড থাকে
রসানি

64
যুগের সূত্রপাত? ওহ আমার, এটি মিলিয়ন বছরে আমার মনকে অতিক্রম করতে পারত না।
অগ্নুল

4
এক্সট্র্যাক্ট নির্বাচন করুন (আমার_ইন্টারওয়াল / 00 F০০ এর মধ্যবর্তী সময়টি) (অন্তর অন্তরতে 'ডিভিড ইন্টিজার' সমর্থন রয়েছে, ফলাফলটি বিরতি, এবং নিষ্কর্ষের ফলাফলটি পূর্ণসংখ্যক, ভাসমান নয়)। So. অটোকাস্ট / মেঝে সম্পন্ন হয়েছে।
অফেনসো

19
সতর্কতা: সহজভাবে সূচনাকালে মহাকাশটি নিষ্ক্রিয়ভাবে ধরে নেওয়া হয় যে এক মাস = 30 দিন এবং এক বছর = 365.25 দিন।
টেডি

@ টেডি আমরা এটি দিয়ে কী করতে পারি? কীভাবে এই সমস্যাটি এড়াতে এবং আসল সংখ্যার পর্ব পেতে?
Asmox

18

আপনি যদি পূর্ণসংখ্যার অর্থ দিনগুলি চান:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

গ্রেট! তার জন্য আপনাকে ধন্যবাদ :) তবুও, আমি দেখতে পেয়েছি যে আমরা এখন এটি হতে সংশোধন করতে পারি SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(আমি Pg 9.4 ব্যবহার করছি), কেবলমাত্র একটি যুক্তি যখন age(ts)স্বয়ংক্রিয়ভাবে ব্যবহার করি CURRENT_DATE
1111161171159459134

7
সতর্কতা: সহজভাবে সূচনাকালে মহাকাশটি নিষ্ক্রিয়ভাবে ধরে নেওয়া হয় যে এক মাস = 30 দিন এবং এক বছর = 365.25 দিন।
টেডি

3

দিনের সংখ্যা পাওয়ার জন্য সবচেয়ে সহজ উপায় হ'ল:

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

আমি যতদূর জানি এটি একই হিসাবে ফিরে আসবে:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

27
যদি আপনার বিরতি থাকে তবে '1 month 0 days'ব্যবহার extract(day from …)আপনাকে 0ফলাফল হিসাবে দেবে।
আনডেরিক্স

1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

::intরূপান্তর rounding নীতিকে অনুসরণ করে। আপনি যদি গোলটি ডাউন হিসাবে আলাদা ফলাফল চান তবে আপনি সম্পর্কিত গণিত ফাংশন যেমন ব্যবহার করতে পারেন floor


1

আপনি যদি টেবিল ক্ষেত্রটি রূপান্তর করেন:

  1. ক্ষেত্রটি নির্ধারণ করুন যাতে এতে কয়েক সেকেন্ড থাকে:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. মানটি বের করুন। অন্তরগুলি বড় হয়ে যাওয়ার পরে আপনি অন্য কোনও জ্ঞানের কাছে কাস্ট করতে ভুলবেন না আপনি একবারে অপ্রীতিকর চমক পেতে পারেন:

    EXTRACT(EPOCH FROM field)::int


আমি মনে করি না রেডশিফ্ট ইন্টারভাল ডেটাটাইপ সমর্থন করে। এটা ঠিক বড় হবে।
matt2000

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.