2016-04-14 2 views
3

Я пишу запрос в SPARQL, и я хочу сравнить значение даты без времени. В настоящее время я получаю значение datetime, такое как 2014-08-14T13:00:00Z. Тем не менее, я хочу сделать фильтр на сегодняшний день, такие какУдалить время из datetime в spaqrl

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

Я новичок в SPARQL, так что мне нужна помощь. Благодарю.

РЕДАКЦИЯ


Спасибо за ребята реагирования. Мои извинения за xsd:dateTime

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

я решил попробовать следующее, хотя я хотел много «покрасивее» решения.

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

Остерегайтесь, что '' 2014-08-15 "^^ xsd: dateTime' не может быть юридическим датой, даже если это законная' xsd: date'. –

+0

Используйте вместо этого '' 2014-08-15 "^^ xsd: date'. – scotthenninger

ответ

2

Вы можете сделать это, но не совсем так, как задает ваш вопрос. Литературные формы для dateTimes должны иметь все поля (кроме часового пояса), поэтому «2014-08-15» ^^ xsd: dateTime на самом деле не является официальным датапребыванием. См. 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 | 
-------------------------------------------------------------------------- 

Если вы хотите включить часовой пояс, вы тоже можете это сделать; они разрешены в xsd: датах.

Если вы хотите, чтобы отфильтровать, не создавая новую дату, вы также можете сделать что-то вроде

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

Это может быть довольно чистое решение.

Примечание о вашем фильтрах, однако. Вы можете фильтровать значение переменной с константой, как и вы, но часто (но не всегда) предлагает более простой способ. Например, вместо:

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

вы обычно просто использовать значение в месте, или использовать значения указать значение переменной:

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

Вы могли бы попробовать простой приведение к xsd:date, но механизм SPARQL, скорее всего, сохранит время. Таким образом, это становится вопросом разбора.Одним из способов является просто использовать SUBSTR, так как количество символов известно:

FILTER (xsd:date(SUBSTR(str(?date), 0, 11)) = "2014-08-15"^^xsd:date) 

Другой заключается в создании даты из формата даты и времени:

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

Возможно, не так удобно, учитывая, что CONCAT требует преобразования строки , но общая идея состоит в том, чтобы построить строку из значения datetime и привести к xsd:date.

+0

Обратите внимание, что решение substr (и конкатенация строк, которые вы и я оба использовали) имеют слабость в том, что они не включают часовой пояс, а timezones * разрешены в xsd: датах. –

+0

Я не в курсе всей моей арифметики, но разве не возможно, что ГГГГ-ММ-ДД в одном часовом поясе может быть такой же, как ГГГГ-ММ-ДД + 1 в другой? Сохранение этих часовых поясов может быть важным. –

+0

Да, это похоже на другую тему и очень зависит от того, как создаются времена и какие сравнения необходимы. Всегда можно добавить смещение, чтобы перейти к UTC. – scotthenninger