从spaqrl中的日期时间中删除时间

时间:2016-04-14 17:40:54

标签: sparql owl ontology rdfs

我正在SPARQL编写一个查询,我想在没有时间的情况下比较日期值。目前,我正在获取日期时间值,例如2014-08-14T13:00:00Z。但是,我想对日期进行过滤,例如

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

我是SPARQL的新手,所以我需要一些帮助。感谢。

EDITED

感谢响应人员。我为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)

2 个答案:

答案 0 :(得分:2)

你可以这样做,但不完全是你的问题所要求的方式。 dateTimes的文字形式必须包含所有字段(时区除外),因此“2014-08-15”^^ xsd:dateTime 实际上不是合法的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:dates中被允许。

如果您想在不创建新日期的情况下进行过滤,您还可以执行类似

的操作
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 :(得分: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需要字符串转换,可能不那么方便,但一般的想法是从日期时间值构建字符串并转换为xsd:date