MySQL DATETIME dakikayı dakikaya kadar seçin

Sonuçları iki tablo arasında aynı zamana göre eşleştirmem gerekiyor, ancak zaman damgaları nasıl kaydedildikleri nedeniyle bir saniyelik farklılık gösteriyor. Örnek 1 gibi bir sonuç elde etmek istiyorum ancak yalnızca yıldız işareti ile Örnek 2 'deki değerleri aldım. Secods'ı karşılaştırmadan çıkarmak veya en yakın DATETIME değerine karşılık gelen değeri seçmek için en iyi yol hangisidir?

Şu anda bu sorguyu kullanıyorum:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1, Table2 
    WHERE ... conditions for the other parameters of Table1 and Table2... 
    AND Table1.TimeSTamp1 = Table2.TimeStamp2

En iyi uygulama hakkında herhangi bir öneri sıcak karşılandı.


Örnek 1

TimeStamp1          ¦   Param1  ¦   TimeStamp2          ¦   Param2
2011-01-01 00:00:35 ¦   1       ¦   2011-01-01 00:00:35 ¦   a       *
2011-01-01 00:01:35 ¦   2       ¦   2011-01-01 00:01:35 ¦   b
2011-01-01 00:02:37 ¦   3       ¦   2011-01-01 00:02:35 ¦   c
2011-01-01 00:03:31 ¦   4       ¦   2011-01-01 00:03:35 ¦   d
2011-01-01 00:04:32 ¦   5       ¦   2011-01-01 00:04:35 ¦   e
2011-01-01 00:05:38 ¦   6       ¦   2011-01-01 00:05:35 ¦   f
2011-01-01 00:06:36 ¦   7       ¦   2011-01-01 00:06:36 ¦   g       *
2011-01-01 00:07:32 ¦   8       ¦   2011-01-01 00:07:35 ¦   h
2011-01-01 00:08:33 ¦   9       ¦   2011-01-01 00:08:35 ¦   i
2011-01-01 00:09:33 ¦   10      ¦   2011-01-01 00:09:33 ¦   l       *
2011-01-01 00:10:35 ¦   11      ¦   2011-01-01 00:10:35 ¦   m       *
2011-01-01 00:11:29 ¦   12      ¦   2011-01-01 00:11:31 ¦   n

lll Example 2

TimeStamp1          ¦   Param1  ¦   TimeStamp2          ¦   Param2
2011-01-01 00:00:35 ¦   1       ¦   2011-01-01 00:00:35 ¦   a
2011-01-01 00:06:36 ¦   7       ¦   2011-01-01 00:06:36 ¦   g
2011-01-01 00:09:33 ¦   10      ¦   2011-01-01 00:09:33 ¦   l
2011-01-01 00:10:35 ¦   11      ¦   2011-01-01 00:10:35 ¦   m
7

3 cevap

Bu MySql ifadesi, saniyelerle sıfırlanan DATETIME değerlerini size geri verecektir.

CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME)

Şuna bir bak. http://dev. mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format . Yani böyle bir sorgu ile sonuçlanabilir:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1
    JOIN Table2 ON  CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME)
                 =  CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME)
    WHERE ... conditions for the other parameters of Table1 and Table2... 

Ama dikkat et. Otomatikleştirilmiş zaman damgaları, kayan nokta sayıları gibidir; İkisi birbirine eşit olduğu zaman sadece şans. Zaman damgalarınızı dakikaya kesmek tamam olabilir, ancak bir zaman damgasını diğerinden çıkarmak ve farklılıkların (veya farklılıkların mutlak değerlerinin) karşılaştırılması daha iyi olabilir.

Ayrıca, bu birleşim yavaş olacaktır çünkü her bir değerde ikinci kesme işlevini çalıştırması gerektiğinden, herhangi bir dizin kullanamaz.

ile bir kereden bir diğerini çıkarabilirsiniz. TIMESTAMPDIFF() . Ama dikkat et. Bu işlev, yalnızca birkaç gün içinde zaman damgaları için saniyeler düzeyinde doğru şekilde çalışır; (büyük acılar ile keşfettiğim gibi) aşırı derecede taşar.

Zaman damgalarını, eklediğiniz anda dakikalara kırpmayı deneyebilirsiniz. Bu onları indeksine izin verir.

10
katma
Teşekkürler, TIMESTAMPDIFF işi yapar. bazen çift girişler alıp onları kaldırmak çok zaman alır. Bu durumda tarihi daha hızlı dönüştürürseniz test edeceğim.
katma yazar Andrew Strathclyde, kaynak

TIMESTAMPDIFF 'i kullanabilirsiniz. saniye cinsinden farkı saniye cinsinden hesaplamak için:

SELECT t1.TimeStamp1, t1.Param1, t2.TimeStamp2, t2.Param2
FROM Table1 t1
LEFT JOIN Table2 t2
ON ABS(TIMESTAMPDIFF(SECOND,t1.TimeStamp1,t2.TimeStamp2))<=4
WHERE ...

Ollie Jones uyarısı bildiriyorum MySQL 5.1.58 sürümünde TIMESTAMPDIFF'i test etti ve en az 10000 yıla kadar farklılık gösteren zaman damgası ile taşma olmadığını tespit etti. Yani belki bu sorun giderildi.

1
katma
WHERE ...
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold:

eşiği , artık bir eşleşme istemediğiniz saniye sayısıdır (ör. 1 dakika için 60).

1
katma
Denedim ama Hata 2013'e kadar çok zaman alıyor.
katma yazar Andrew Strathclyde, kaynak