كيفية تحويل في SQL عدد الثواني في مدة الإنسان قابل للقراءة؟

StackOverflow https://stackoverflow.com/questions/197096

  •  10-07-2019
  •  | 
  •  

سؤال

وفي قاعدة بيانات SQL أقوم بإجراء بعض يختار، أن الحصول على مدة (نتيجة لالطرح بين تاريخين) في ثانية كما عدد صحيح. ولكن أريد أن تهيئة هذه النتيجة في شكل قابل للقراءة مثل 'ح ح: مم "أو" DD: صاحب السمو. هل هذا ممكن في SQL وكيف يمكنني تحقيق ذلك؟

هل كانت مفيدة؟

المحلول

في SQL 2005، يمكنك استخدام ما يلي:

    select convert(varchar(8), dateadd(second, [SecondsColumn], 0),  108)

والتي لأول مرة تحويل ثواني إلى تاريخ بعد 1900-01-01، ثم يحصل على HH: MM: SS جزء.

إذا كان العمود أكثر من 24 ساعة، وهذا سوف يتدحرج، إذا كنت تريد أيام ثم ساعات في هذه الحالة فقط أن تفعل شيئا من هذا القبيل:

case when SecondsColumn> (24*60*60) 
        then 
            cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4))
        +   'd' + convert(varchar(2), dateadd(second, SecondsColumn, 0), 108) 
    else
            convert(varchar(8), dateadd(second, SecondsColumn, 0), 108) 
    end

نصائح أخرى

وكل قاعدة بيانات يفعل ذلك بطريقة مختلفة. يمكنني استخدام كيو ويفعل مثل ذلك:

select to_char(my_date - my_other_date, 'HH:MM:SS');

وسيكون لديك للتشاور دليل لقاعدة البيانات الذي تستخدمه.

وعلى افتراض أن يكون لديك ثانية:

DECLARE @DurationSeconds INT

-- 25h 45m 14s
SET @DurationSeconds = (25 * 3600) + (45 * 60) + (14)

SELECT 
  @DurationSeconds, 
  @DurationSeconds / 3600 hours, 
  @DurationSeconds % 3600 / 60 minutes,
  @DurationSeconds % (3600 / 60) seconds

وأنا سأترك مهمة التنسيق الذي لطيف لك. : -)

وليس هناك معيار، على الرغم من العديد في DBMSs لها جملة المخصصة الخاصة بهم.

في عام فمن الأفضل أن تفعل تنسيق مقابل البشرية القراءة العمل في طبقة العرض التطبيق الخاص بك بدلا من أي مكان بالقرب من قاعدة البيانات.

في أوراكل SQL:

   -- 86,400 seconds in a  day
   --  3,600 seconds in an hour
   --     60 seconds in a  minute
   select duration, -- seconds
    trunc((duration)/86400) || ':' || -- dd
    trunc(mod(duration,86400)/3600) || ':' || -- hh
    trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm
    mod(mod(mod(duration,86400),3600),60) -- ss
   as human_readable
   from dual
   ;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top