سؤال

لدي varchar الميدانية في ملقم SQL 2005 وهذا تخزين قيمة الوقت في شكل "hh:mm"ss.ش ش ش ش".

ما كنت حقا تريد القيام به هو أن تأخذ متوسط باستخدام المدمج في وظيفة الكلي من تلك قيم الوقت.ومع ذلك, هذا:

SELECT AVG(TimeField) FROM TableWithTimeValues

لا يعمل منذ (بالطبع) SQL لن متوسط varchars.ومع ذلك ،

SELECT AVG(CAST(TimeField as datetime)) FROM TableWithTimeValues

أيضا لا يعمل.أقرب ما أستطيع أن أقول, SQL لا تعرف كيفية تحويل قيمة مع الوقت فقط و لا تاريخ في حقل التاريخ والوقت.لقد حاولت مجموعة متنوعة واسعة من الأشياء للحصول على SQL لتشغيل هذا المجال إلى التاريخ والوقت ، ولكن حتى الآن لا حظ.

يمكن لأي شخص أن يقترح طريقة أفضل ؟

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

المحلول

SQL Server يمكن تحويل الوقت فقط جزء من قيمة من سلسلة التاريخ والوقت ، ومع ذلك في المثال الخاص بك, لديك الدقة من 4 خانات عشرية.SQL Server 2005 لا تعترف سوى 3 أماكن.لذلك سوف تحتاج إلى اقتطاع أقصى اليمين حرف:

create table #TableWithTimeValues
(
    TimeField varchar(13) not null
)

insert into #TableWithTimeValues
select '04:00:00.0000'
union all
select '05:00:00.0000'
union all
select '06:00:00.0000'

SELECT CAST(TimeField as datetime) FROM #TableWithTimeValues
--Msg 241, Level 16, State 1, Line 1
--Conversion failed when converting datetime from character string.

SELECT CAST(LEFT(TimeField, 12) as datetime) FROM #TableWithTimeValues
--Success!

هذا سيتم تحويل القيم الصالحة في هذا الموضوع ابتداء من 1900-01-01.SQL Server بحساب التواريخ استنادا إلى 1 يوم = 1 (عدد صحيح).أجزاء من الأيام ثم أجزاء من القيمة 1 (أيظهر 0.5).لأن موعد لم يحدد في تحويل SQL Server تعيين قيمة 0 أيام (1900-01-01) الذي يستوعب حاجتنا إلى متوسط الوقت جزء.

لإجراء AVG عملية على التاريخ والوقت ، يجب عليك أولا تحويل التاريخ والوقت إلى قيمة عشرية تنفيذ التجميع, ثم يلقي مرة أخرى.على سبيل المثال

SELECT CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME) FROM #TableWithTimeValues
--1900-01-01 05:00:00.000

إذا كنت بحاجة إلى تخزين إضافية كسر عشري ، يمكنك تحويل التاريخ والوقت إلى VARCHAR مع الوقت جزء فقط وسادة السلسلة إلى 13 حرفا:

SELECT CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME), 114) + '0' FROM #TableWithTimeValues

نصائح أخرى

جرب هذا

AVG(CAST(CAST('1900-01-01 ' + TimeField AS DateTime) AS Float))

كنت حقا ينبغي أن متجر تلك الموجودة في عمود التاريخ والوقت على أي حال.مجرد استخدام ثابت التاريخ على هذا الجزء (1/1/1900 هو شائع جدا).ثم يمكنك فقط الاتصال AVG() و لا تقلق بشأن ذلك.

اعتدت Cadaeic استجابة للحصول على الإجابة التي كنت أبحث عنها, لذا فكرت أن حصة هذه المدونة....

كنت أبحث عن الاستعلام الذي من شأنه أن متوسط جميع الأوقات معا وتعطيني العام بدوره حول الوقت على جميع الموافقات.وفيما يلي متداخلة البيان أن يعطيك AVG تات الفردية id و عندما متداخلة العام تات

SELECT 
-- calculates overall TAT for ALL Approvals for specified period of time
-- depending on parameters of query
CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(Tat_mins, 12) as datetime) AS FLOAT)) AS DATETIME), 108) + '0'

from 
(
-- tat is for individual approvals 
SELECT 
dbo.credit_application.decision_status,
dbo.credit_application.application_id,
cast(dbo.credit_application.data_entry_complete as date) as'Data Entry Date',
cast(dbo.credit_application.decision_date as DATE) as 'Decision Date',
avg(datediff(minute, dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date)) as 'TAT Minutes',
convert (char(5), DateAdd(minute, Datediff(minute,dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date),'00:00:00'),108) as 'TAT_Mins'
FROM  dbo.credit_application
where Decision_status not in ('P','N')

group by dbo.credit_application.decision_status,
dbo.credit_application.data_entry_complete,
dbo.credit_application.decision_date
--dbo.credit_application.application_id
)bb

كيف تعتقد أن متوسط على التاريخ والوقت?

أعتقد أن عليك أن المجموعة قبل فترة (الساعة؟), وعرض Count(*)?

SQL Server بتخزين بيانات التاريخ والوقت من 2 إلى 4 بايت الاعداد الصحيحه ، ومن ثم التاريخ والوقت يستغرق 8 بايت.أول أيام منذ تاريخ قاعدة والثاني هو ميلي ثانية منذ منتصف الليل.

يمكنك تحويل قيمة إلى عدد صحيح و إجراء العمليات الحسابية ، ولكن فقط تحويل عوائد "أيام" جزء من قيمة مثلاحدد تحويل(int,getdate()).فإنه من الصعب العودة "الوقت" الجزء صحيحا.

يستخدم SQL Server 2008 خيار بالنسبة لك ؟ هذا الإصدار الجديد الوقت المخصص نوع البيانات.

شكرا يا أندي.

أود معرفة الفرق بين كل التواريخ التعسفي نقطة (01/01/1900) ، متوسط ومن ثم إضافته مرة أخرى إلى النقطة التعسفي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top