2016-04-14 37 views
3

SPARQL'de bir sorgu yazıyorum ve tarih değerini zaman olmadan karşılaştırmak istiyorum. Şu anda, 2014-08-14T13:00:00Z gibi bir datetime değeri alıyorum. Ancak, böyle ben SPARQL yeni amdatetime zamanından kaldır spaqrl

FILTER (?date = "2014-08-15"^^xsd:dateTime) 

olarak tarihte bir filtre yapmak istiyorum, bu yüzden biraz yardıma ihtiyacım var. Teşekkürler. tepki çocuklar için

EDITED


teşekkürler. xsd:dateTime

FILTER (?date = "2014-08-15"^^xsd:date) 

için özür dilerim ben çok 'güzel' çözüm istedi rağmen aşağıdakileri deneyin karar verdik.

FILTER (?date >= "2014-08-15T00:00:00Z"^^xsd:dateTime && ?date <= "2014-08-15T24:00:00Z"^^xsd:dateTime) 
+0

"xsd: date" yasal olsa bile "2014-08-15" ^^ xsd: dateTime öğesinin yasal bir tarih olmayabileceğine dikkat edin. –

+0

Bunun yerine '' 2014-08-15 '^ ^^ xsd: date' kullanılmasını öner. – scotthenninger

cevap

2

Bunu yapabilirsiniz, ancak sorunuzu tam olarak istediğiniz gibi değil. DateTimes için tam formlar, tüm alanları (zaman dilimi hariç) içermelidir, yani "2014-08-15" ^^ xsd: dateTime aslında yasal bir dateTime değildir. Tarih saat biçimi hakkında daha fazla bilgi için bkz. the definition.

prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

select ?dt ?date where { 
    values ?dt { "2011-01-10T14:45:13.815-05:00"^^xsd:dateTime } 

    bind(xsd:date(concat(str(year(?dt)),"-", 
         str(month(?dt)),"-", 
         str(day(?dt)))) 
     as ?date) 
} 
-------------------------------------------------------------------------- 
| dt           | date     | 
========================================================================== 
| "2011-01-10T14:45:13.815-05:00"^^xsd:dateTime | "2011-01-10"^^xsd:date | 
-------------------------------------------------------------------------- 
: bahsedilen

, bir datetime gelen yıl, ay ve günü çekin ve diğer tarihleri ​​ile karşılaştırabilirsiniz bir tarihte bir araya onları geri koymak için yeterince kolay

Saat dilimini eklemek isterseniz, bunu da yapabilirsiniz; xsd'de izin verilir: tarihler. Yeni tarih yaratmadan filtrelemek istese

, ayrıca oldukça temiz bir çözüm olabilir

filter (year(?dt) = 2015 && 
     month(?dt) = 01 && 
     day(?dt) = 10) 

gibi bir şey yapabilirdi.

filtrenizle ilgili bir not. Bir değişkenin değerini, yaptığınız gibi sabit olarak filtreleyebilirsiniz, ancak çoğu zaman (ama her zaman değil) daha kolay bir yol önerir. Yerine Örneğin:

select ?s where { 
    ?s a ?o . 
    filter (?o = <something>) 
} 

genellikle sadece yerinde değeri kullanmak ya da bir değişkenin değerini belirtmek içindeğerleri kullanmak istiyorum:

select ?s where { 
    ?s a <something> . 
} 
select ?s where { 
    values ?o { <something> } 
    ?s a ?o . 
} 
1

Sen deneyebilirsiniz xsd:date için basit bir döküm, ancak SPARQL motoru muhtemelen zamanı koruyacaktır. Böylece ayrıştırma meselesi haline gelir.

Başka datetime biçiminden tarih oluşturmaktır
FILTER (xsd:date(SUBSTR(str(?date), 0, 11)) = "2014-08-15"^^xsd:date) 

: Verilen Belki olarak uygun değil

FILTER (xsd:date(CONCAT(str(YEAR(?date)), "-", str(MONTH(?date)), "-", str(DAY(?date)))) = "2014-08-15"^^xsd:date) 

CONCAT dize dönüştürme gerektirdiği karakter sayısı bilindiği gibi bir yolu, sadece SUBSTR kullanmaktır Ancak genel fikir, dize tarih değeri üzerinden oluşturmak ve xsd:date için döküm.

+0

substr çözümünün (ve sizin ve benim kullandığımız dizge bitiştirmesinin) zaman dilimini içermediğinden ve xsd: tarihlerinde * zaman dilimlerinin * izin verildiğinden dolayı bir zayıflığa sahip olduğunu unutmayın. –

+0

Tüm randevu aritmetiğimde değilim, ancak tek bir saat diliminde YYYY-AA-GG'nin YYYY-AA-GG + 1 ile aynı tarihte olması mümkün değil mi? Bu saat dilimlerinin korunması önemli olabilir. –

+0

Yea, farklı bir konu gibi görünüyor ve zamanların nasıl üretildiğine ve hangi karşılaştırmanın gerekli olduğuna bağlı. UTC'ye ulaşmak için her zaman ofseti ekleyebilirsiniz. – scotthenninger