SQLite DateTime karşılaştırması


118

Karşılaştırma olarak bir datetime dizesi kullanarak bir sqlite veritabanına karşı sorgudan güvenilir sonuçlar alamıyorum:

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

datetime karşılaştırmalarını sqlite ile nasıl yapmalıyım?

güncelleme: alan mydate bir DateTime veri türüdür


1
Sütununuzda depolanan değer hangi tarih formatıdır mydate? Sanırım SQLite tarafından desteklenen biçimlerden biri değil: sqlite.org/lang_datefunc.html
OMG Ponies

1
Aman Tanrım, bu bir tarih saat veri türü
Brad

4
Bu datetime () kullanımı, ona verdiğiniz tam değerle sonuçlanacaktır, burada kullanmak için bir neden yoktur: onun yerine dizeyi kullanın. Ve sadece tarihlerle uğraşıyorsanız, sıfır zaman bölümlerini silmelisiniz - esasen her iki tarafın da aynı formatta olduğundan emin olun. (Aksi takdirde '2009-11-13', tarihim için daha az olacaktır '2009-11-13 00:00:00'.)

1
SQLite ile Visual Studio'nun bir tarih / saat sorgusu çalıştırmam için çalışması için Datetime(), @Brad'ın çözümden bahsettiği gibi kullanmam gerekiyor . Aksi takdirde VS2012 şikayet ediyor. Teşekkür ederim Brad.
CaptainBli

çözümünüzü güncellediğiniz için teşekkür ederiz. .NET'teki tarihler için varsayılan biçimin aslında "<" vs ">" için tam tersi sonuçlanması ne kadar tuhaf.
Dave Friedel

Yanıtlar:


58

SQLite'ın özel tarih saat türleri yoktur , ancak birkaç tarih saat işlevi vardır . Bu işlevler tarafından anlaşılan dize temsil biçimlerini (aslında yalnızca 1-10 biçimleri) izleyin (değeri bir dizge olarak saklayın) ve ardından bunları kullanabilirsiniz, ayrıca dizelerdeki sözlüksel karşılaştırma tarih saat karşılaştırmasıyla eşleşecektir (yapmadığınız sürece tarihleri ​​zamanlarla veya tarih zamanlarını zamanlarla karşılaştırmaya çalışın ki bu zaten pek bir anlam ifade etmiyor).

Hangi dili kullandığınıza bağlı olarak, otomatik dönüştürme bile alabilirsiniz . (Örnek gibi SQL ifadelerindeki karşılaştırmalar için geçerli değildir, ancak hayatınızı kolaylaştıracaktır.)


10
İlk cümleyi okuyanlar için, ' datedatetime
17'de SQLite'da

3
Dün burada tür yakınlığı okuyordu: sqlite.org/datatype3.html Temel olarak, bir tarihe ihtiyacınız varsa, dahili olarak kabul edilen sütunda bir date(veya datetime) bildirirsiniztext . Bu ihtiyaçlarıma uyuyor.
alisianoi

100

Bu sorunu çözmek için tarihleri ​​olarak kaydediyorum YYYYMMDD. Böylece, where mydate >= '20090101' and mydate <= '20050505'

Her zaman sadece ÇALIŞIR. Kullanıcıların tarihlerini nasıl girebileceklerini işlemek için yalnızca bir ayrıştırıcı yazmanız gerekebilir, böylece onları dönüştürebilirsiniz YYYYMMDD.


2
Biçim standartlaştırılmışsa, YYYY-AA-GG'ye sahip olmak, çizgiler olmadan nasıl farklı olabilir? Karşılaştırmalar aynı sonuç vermez mi?
Damon

2
@Damon i o veri türü için bir int kullanan düşünüyorum
thumbmunkeys

1
Hayır, bunlar dizelerdir - alıntılarda görebilirsiniz - Ama bu harika bir fikir: Bu YY MM DD siparişi ile tarihleri ​​karşılaştırmak mümkündür. @ Damon ayrıca çizgilerle de çalışmalı!
Sedat Kılınç

1
Saklamak için yyyyMMddHHmmss formatını kullanırsam aynı şeyi yapıp yapamayacağımı merak ediyorum, böylece zaman bölümünü de ekleyebilirim. Bir taşmaya veya başka bir şeye neden olur mu?
faizal

2
Ben kullanıyorum: yyyyMMddHHmm sorunsuz, yyyyMMddHHmmss'nin aynı şekilde çalışmasını beklerim
Steve Byrne

39

Son zamanlarda aynı sorunu yaşadım ve şu şekilde çözdüm:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

% s tek tırnak karakterleri arasına alınmalıdır, yani: strftime ('% s', tarih)
mvladic

İşe yarıyor. Belirli bir tarihten sonra tüm satırları seçmek için değiştirilmiş çözüm: SELECT * FROM table WHERE strftime ('% s', eklendi)> strftime ('% s', "2017-01-01 00:00:00")
New Progammer

strftimeBu örnekteki gibi bir WHERE cümlesinde kullanmayı değerlendiriyorum ve bir sorum var: Böyle kullanmak verimli strftimemi? Her satır için bir kez mi yoksa sorgu başına bir kez mi değerlendirilir?
Alvaro Gutierrez Perez

bu doğru cevap olarak kabul edilmelidir!
Luka Sh

20

Aşağıdakiler benim için SQLite kullanarak iyi çalışıyor:

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

Bu benim için iOS'ta çalıştı, Objective-C Sorgum şu şekildedir: '2015-04-01' VE '2015-04-30' ARASINDAKİ TARİHİ ARASINDAKİ cars_sales_tbl'DEN SAYI (carSold) SEÇİN VE carType = "Hibrit"
Randika Vishman

9

Sqlite tarihlerle karşılaştırılamaz. Saniyelere dönüştürmemiz ve tamsayı olarak atmamız gerekiyor.

Misal

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;

8

Aşağıdaki benim için çalıştı.

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'

bunun yerine arasında kullanabilirsiniz.
Tamim Attafi

6

İki gün öncesine kadar ve bugünün sonuna kadar veri almak istediğim bir durum var. Aşağıdakilere vardım.

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

Tamam, teknik olarak ayrıca yarın gece yarısı orijinal poster gibi veri varsa çekiyorum, ancak verilerim tamamen tarihsel.

Unutulmaması gereken en önemli şey, ilk gönderen 2009-11-15 00:00: 00'dan sonraki tüm verileri hariç tuttu. Bu nedenle, ayın 15'inde gece yarısı kaydedilen veriler dahil edildi , ancak ayın 15'inde gece yarısından sonraki veriler dahil edilmedi. Eğer sorguları,

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

Anlaşılır olması için between cümlesinin kullanılması.

Biraz daha iyi olurdu. Yine de, bir saatin gerçekte 60 saniyeden fazla olabileceği artık saniyeleri hesaba katmıyor, ancak buradaki tartışmalar için yeterince iyi :)


2

Saati, saat dilimi bilgisiyle birlikte saklamak zorunda kaldım ve aşağıdaki formatta çalışan sorguları alabildim:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

Zaman, veritabanında aşağıdaki formatta normal METİN olarak saklanır:

2015-03-06 20:12:15 -04:00

2

Tarihleri ​​karşılaştırmak için yöntemler aşağıdadır, ancak ondan önce DB'de depolanan tarih biçimini belirlememiz gerekir.

AA / GG / YYYY SS: DD biçiminde depolanan tarihlerim var, bu nedenle bu biçimde karşılaştırılması gerekiyor

  1. Aşağıdaki sorgu, tarihi AA / GG / YYY biçimine dönüştürmeyi karşılaştırır ve son beş günden bugüne kadar olan verileri alır. BETWEEN operatörü yardımcı olacaktır ve basitçe başlangıç ​​tarihini VE bitiş tarihini belirtebilirsiniz.

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
  2. Aşağıdaki sorguda (>) operatöründen büyük kullanılır.

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

Yaptığım tüm hesaplamalar şu anki saati kullanıyor, formatı ve tarihi ihtiyacınıza göre değiştirebilirsiniz.

Umarım bu sana yardımcı olur

Summved


1

Tarihleri ​​seçtiğiniz biçimde işlemek için kendi kullanıcı işlevlerinizi de yazabilirsiniz . SQLite, kendi kullanıcı işlevlerinizi yazmak için oldukça basit bir yönteme sahiptir. Örneğin, zaman sürelerini birbirine eklemek için birkaç tane yazdım.


0

Yaptığım sorgu şu şekilde:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

İpucunu @ ifredy'nin cevabından aldım. Tek yaptığım, bu sorgunun Objective-C kullanarak iOS'ta çalıştırılmasını istedim. Ve çalışıyor!

Umarım iOS Geliştirme yapan biri de bu cevaptan faydalanır!


0

Şu anda System.Data.SQlite NuGet paketi (sürüm 1.0.109.2) kullanarak geliştiriyorum. Hangi SQLite 3.24.0 sürümünü kullanıyor.

Ve bu benim için çalışıyor.

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

Datetime () işlevini kullanmak için netlemiyorum. Belki de o SQLite sürümündeki SQL sorgusunu zaten güncellediler.

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.