MySQL'de zaman damgası tarihlerini yalnızca tarih parametresiyle nasıl karşılaştırabilirim?


91

Bir SQL deyiminde, TIMESTAMP olarak kaydedilen bir tarihi YYYY-AA-GG biçimindeki bir tarihle nasıl karşılaştırırım?

Ör .: SELECT * FROM table WHERE timestamp = '2012-05-25'

Bu sorgunun belirtilen günde zaman damgası olan tüm satırları döndürmesini istiyorum, ancak yalnızca gece yarısı zaman damgasına sahip satırları döndürüyor.

Teşekkürler

Yanıtlar:


149

DATE()Zaman damgasının tarih bölümünü çıkarmak için işlevi kullanabilirsiniz :

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'

Yine de, zaman damgası sütununda bir dizininiz varsa, bu daha hızlı olacaktır çünkü eğer varsa zaman damgası sütununda bir dizin kullanabilir:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

6
Az önce koştuğum küçük bir testle,
BETWEEN'i

1
Hangi sayının ne tür anlamına geldiğinin açık olduğu bir tarih kullanın.
Lukas Salich


7

Bazılarının önerdiği gibi, kullanarak DATE(timestamp)sütuna manipülasyon uyguluyorsunuz ve bu nedenle dizin sıralamasına güvenemezsiniz.

Ancak, kullanmak BETWEENyalnızca milisaniyeleri de eklerseniz güvenilir olacaktır. Örnek zaman damgası olarak BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'size arasında bir zaman damgası ile kayıt dışlamak 2012-05-05 23:59:59.001ve 2012-05-05 23:59:59.999. Bununla birlikte, bu yöntemin bile veri türlerinin kesinliği nedeniyle bazı sorunları vardır. Bazen 999 milisaniye yukarı yuvarlanır.

Yapılması gereken en iyi şey:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

MYSQL'in bir dönüştürme işlevini kullanın:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Bu çalışmalı


1

Bunu araştırırken, BETWEEN çözümünü belirli bir statik olmayan / dize tarihi için bir örnek gösterecek şekilde değiştirmenin iyi olacağını düşündüm, bunun yerine değişken bir tarih veya bugünkü gibi CURRENT_DATE(). Bu , log_timestamp sütunundaki dizini KULLANACAKTIR.

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

Ertesi gün 12AM vakasından kaçınmak için saniye / mikrosaniye yaptım. Bununla birlikte, daha okuyucu dostu BETWEEN olmayan bir yaklaşım için karşılaştırma operatörleri aracılığıyla `` INTERVAL '1 GÜN' 'yapabilirsiniz:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

Bu yaklaşımların her ikisi de dizini kullanacak ve ÇOK daha hızlı işlemelidir. Her ikisi de eşit derecede hızlı görünüyor.


0

Sorguyu çalıştırmak için SQL parametreleri kullanıyorsanız, bu yardımcı olacaktır.

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

Sorunuzu okuduğumda, 'MySQL' etiketini görene kadar Oracle DB'de olduğunuzu düşündüm . Her neyse, Oracle ile çalışan insanlar için şu yol:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.