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.