كيفية تحويل في SQL عدد الثواني في مدة الإنسان قابل للقراءة؟
سؤال
وفي قاعدة بيانات 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
;