2014-04-28 12 views
46

Bir tarih belirli bir ay ve yıl olduğunda sonuçları döndürmek için postgresql db'yi sorgulamaya çalışıyorum. Diğer bir deyişle, bir aylık yıl için tüm değerleri istiyorum.Tarih aralıkları arasındaki Postgresql sorgu

ı şimdiye kadar bunu yapmak mümkün oldum tek yolu şu şekildedir: bununla

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28' 

Sorun tabloyu sorgulamadan önce ilk tarih ve son tarih hesaplamak zorunda olmasıdır. Bunu yapmanın daha basit bir yolu var mı? Eğer >= start AND < end kullanırsanız

Teşekkür tarihleri ​​(ve bazen) ile

+0

daha etkili olması gerektiğini hep aralık bir ay mı yoksa ayın 15'inden belki başlatmak ve aşağıdakilerden 7'sinde sona yönünde olabilir: Yani böyle yazabilirsiniz ay? – frlan

cevap

89

çok şey daha basit hale gelir.

Örneğin

: hala ihtiyaç ayın başlangıç ​​tarihini hesaplamak gerekir Bu durumda

SELECT 
    user_id 
FROM 
    user_logs 
WHERE 
     login_date >= '2014-02-01' 
    AND login_date < '2014-03-01' 

, ama bu yollardan herhangi sayıda sağlıyor olmalı.

Bitiş tarihi de basitleştirilmiştir; sadece bir ay ekleyin. 28, 30, 31 ile ilgili hiçbir karışıklık, vb


Bu yapı aynı zamanda endeksler kullanımını sürdürmek mümkün olma avantajına sahiptir.


Birçok kişi aşağıdaki gibi bir form önerebilir, ancak yapamaz kullanım indeksleri:

WHERE 
     DATEPART('year', login_date) = 2014 
    AND DATEPART('month', login_date) = 2 

Bu tablodaki her satır için koşulların hesaplanması içerir (bir tarama) ve eşleşecek satır aralığını bulmak için dizin kullanmıyor (aralık araması).

+1

İlk yaklaşımın aylar (günler yerine) ile karışması gerekiyor. 2014-12-01' ve '2015-01-01'. İkincisi de endekslenebilir, ama bu önemsiz değil, itiraf ediyorum - 'EXTRACT()' daha uyumlu görünüyor. – pozs

-7

Belgeleri okuyun.

WHERE 
(
    date_trunc('day',table1.date_eval) = '2015-02-09' 
) 

veya

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')  

Juanitos Ingenier:

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

böyle bir sorgu kullanılır.

+1

Bu, soruya tam olarak cevap vermiyor. Soru, ay ve yıl bazında tarihler sorar. – Ram

3

PostreSQL 9.2'den Range Types desteklenmektedir.

SELECT user_id 
FROM user_logs 
WHERE '[2014-02-01, 2014-03-01)'::daterange @> login_date 

bu dize karşılaştırma