Bir zaman damgası sütununda ortalama nasıl bulunur

Bir etkinliğin başladığı ortalama süreyi bulmam gerekiyor. Başlangıç ​​zamanı, DB'de startDate sütununa kaydedilir.

|    StartDate        |
|=====================|
|2015/04/10 3:46:07 AM|
|2015/04/09 3:47:37 AM|
|2015/04/08 3:48:07 AM
|2015/04/07 3:43:44 AM|
|2015/04/06 3:39:08 AM|
|2015/04/03 3:47:50 AM|

Yani ihtiyacım olan şey olayın günlük olarak başladığı ortalama süreyi (ss: dd: ss) hesaplamak.

Buna nasıl yaklaşacağımı bilemiyorum. Aşağıdaki sorgu işe yaramaz çünkü coz toplanır ve toplam değeri toplam sayıya bölün

SELECT AVG(DATE_FORMAT(StartDate,'%r')) FROM MyTable
1
zamana attı, sonra ortalama
katma yazar JohnLBevan, kaynak
zamana attı, sonra ortalama
katma yazar JohnLBevan, kaynak
Ortalama, sayıya bölünen öğelerin toplamı olarak tanımlanır, öyleyse neden istediğin bu değil? Ancak DATE_FORMAT onu bir dizge haline getirecek, bu yüzden muhtemelen sorun bu mu? avg (time (StartDate))) 'ı deneyin
katma yazar Sami Kuhmonen, kaynak
Ortalama, sayıya bölünen öğelerin toplamı olarak tanımlanır, öyleyse neden istediğin bu değil? Ancak DATE_FORMAT onu bir dizge haline getirecek, bu yüzden muhtemelen sorun bu mu? avg (time (StartDate))) 'ı deneyin
katma yazar Sami Kuhmonen, kaynak

8 cevap

Demo: http://sqlfiddle.com/#!9/33c09/3

Beyan:

select TIME_FORMAT(avg(cast(startDate as time)),'%h:%i:%s %p') as avg_start_date
from demo

Kurmak:

create table demo (startDate datetime);

insert demo (startDate) values ('2015-04-10 3:46:07');
insert demo (startDate) values ('2015-04-09 3:47:37');
insert demo (startDate) values ('2015-04-08 3:48:07');
insert demo (startDate) values ('2015-04-07 3:43:44');
insert demo (startDate) values ('2015-04-06 3:39:08');
insert demo (startDate) values ('2015-04-03 3:47:50');

Açıklama:

  • Zamana Aktarma, Date bileşeninin yok sayılmasını sağlar (tarih günlerinin ortalaması alıyorsanız ve ortalama bir süre için ümit ediyorsanız, çift rakamlı sayıları ortalamaya almak ve birimin yalnızca ortalama olsaydı, gördüklerinizle eşleşmesini ummak gibi olur) bu sayıların birimleri).
  • AVG, zaten aşina olduğunuz ortalama bir işlevdir.
  • TIME_FORMAT, verilerinizi kullanıcı dostu bir şekilde sunmak, böylece sonuçlarınızı kontrol etmek için.
3
katma

Demo: http://sqlfiddle.com/#!9/33c09/3

Beyan:

select TIME_FORMAT(avg(cast(startDate as time)),'%h:%i:%s %p') as avg_start_date
from demo

Kurmak:

create table demo (startDate datetime);

insert demo (startDate) values ('2015-04-10 3:46:07');
insert demo (startDate) values ('2015-04-09 3:47:37');
insert demo (startDate) values ('2015-04-08 3:48:07');
insert demo (startDate) values ('2015-04-07 3:43:44');
insert demo (startDate) values ('2015-04-06 3:39:08');
insert demo (startDate) values ('2015-04-03 3:47:50');

Açıklama:

  • Zamana Aktarma, Date bileşeninin yok sayılmasını sağlar (tarih günlerinin ortalaması alıyorsanız ve ortalama bir süre için ümit ediyorsanız, çift rakamlı sayıları ortalamaya almak ve birimin yalnızca ortalama olsaydı, gördüklerinizle eşleşmesini ummak gibi olur) bu sayıların birimleri).
  • AVG, zaten aşina olduğunuz ortalama bir işlevdir.
  • TIME_FORMAT, verilerinizi kullanıcı dostu bir şekilde sunmak, böylece sonuçlarınızı kontrol etmek için.
3
katma

Öncelikle, üzerinde bir toplama işlevini kullanabilmeniz için tarih saatinizi yalnızca zaman içerecek şekilde çıkartmanız gerekir. Bu, TIME yazın. Ardından, hedefinize ulaşmak için AVG() yerleşik toplama işlevini, tablonuzdaki her gün için ortalama başlangıç ​​tarihi almak üzere gruplandırma kullanabilirsiniz.

Bu tarafından yapılır

SELECT AVG(StartDate::TIME) FROM MyTable

Günde ortalama başlangıç ​​zamanı almak için

SELECT StartDate::DATE, AVG(StartDate::TIME) FROM MyTable GROUP BY StartDate::DATE

Ayrıca, o zamandan itibaren hiçbir etkinliği olmayan günler geçirmek istiyorsanız, burayı inceleyin MySQL'de bir seçenek olmayan generator_series eşdeğeri için.

2
katma

Öncelikle, üzerinde bir toplama işlevini kullanabilmeniz için tarih saatinizi yalnızca zaman içerecek şekilde çıkartmanız gerekir. Bu, TIME yazın. Ardından, hedefinize ulaşmak için AVG() yerleşik toplama işlevini, tablonuzdaki her gün için ortalama başlangıç ​​tarihi almak üzere gruplandırma kullanabilirsiniz.

Bu tarafından yapılır

SELECT AVG(StartDate::TIME) FROM MyTable

Günde ortalama başlangıç ​​zamanı almak için

SELECT StartDate::DATE, AVG(StartDate::TIME) FROM MyTable GROUP BY StartDate::DATE

Ayrıca, o zamandan itibaren hiçbir etkinliği olmayan günler geçirmek istiyorsanız, burayı inceleyin MySQL'de bir seçenek olmayan generator_series eşdeğeri için.

2
katma

Zaman damgasını unixtime değerine dönüştürebilir, ortalamayı hesaplayabilir ve zaman damgası biçimine geri dönebilirsiniz:

>select FROM_UNIXTIME((sum(UNIX_TIMESTAMP(tstamp))/count(*))) from test
April, 07 2015 07:45:25

Here is the example with your data: timestamp column average

0
katma
Not: Bu, tarihlerin yanı sıra saatlerin de ortalama olmasını sağlar; bu yüzden zamanınız her saat 3:45 civarında olsa da, ortalama zaman 7:45: S.
katma yazar JohnLBevan, kaynak

Zaman damgasını unixtime değerine dönüştürebilir, ortalamayı hesaplayabilir ve zaman damgası biçimine geri dönebilirsiniz:

>select FROM_UNIXTIME((sum(UNIX_TIMESTAMP(tstamp))/count(*))) from test
April, 07 2015 07:45:25

Here is the example with your data: timestamp column average

0
katma
Not: Bu, tarihlerin yanı sıra saatlerin de ortalama olmasını sağlar; bu yüzden zamanınız her saat 3:45 civarında olsa da, ortalama zaman 7:45: S.
katma yazar JohnLBevan, kaynak

Milisaniyeye dönüştür AVG işlevini uygula ve tarihe dön

0
katma
Not: Bu, tarihlerin yanı sıra saatlerin de ortalama olmasını sağlar; Öyleyse, 1 Ocak 2015’te 08: 00’da ve 08:02’sini, 2 Ocak’ta, 08:01’de almak yerine, 08:01
katma yazar JohnLBevan, kaynak

Milisaniyeye dönüştür AVG işlevini uygula ve tarihe dön

0
katma
Not: Bu, tarihlerin yanı sıra saatlerin de ortalama olmasını sağlar; Öyleyse, 1 Ocak 2015’te 08: 00’da ve 08:02’sini, 2 Ocak’ta, 08:01’de almak yerine, 08:01
katma yazar JohnLBevan, kaynak