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

Sparql 从spaqrl中的日期时间中删除时间,sparql,owl,ontology,rdfs,Sparql,Owl,Ontology,Rdfs,我正在SPARQL中编写一个查询,我想比较没有时间的日期值。目前,我得到了一个日期时间值,例如2014-08-14T13:00:00Z。但是,我想对日期进行筛选,例如 FILTER (?date = "2014-08-15"^^xsd:dateTime) 我是SPARQL新手,所以我需要一些帮助。谢谢 编辑 谢谢你们的回复。我为xsd:dateTime FILTER (?date = "2014-08-15"^^xsd:date) 尽管我想要一个更“漂亮”的解决方案,但我还是决定尝试以下方

我正在
SPARQL
中编写一个查询,我想比较没有时间的日期值。目前,我得到了一个日期时间值,例如
2014-08-14T13:00:00Z
。但是,我想对日期进行筛选,例如

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)

FILTER(?date>=“2014-08-15T00:00:00Z”^^xsd:dateTime&&date您可以这样做,但不能完全按照您的问题所要求的方式。dateTime的文本形式必须包含所有字段(时区除外),因此“2014-08-15”^^xsd:dateTime实际上不是法定日期时间。有关日期时间格式的更多信息,请参阅

也就是说,从日期时间中提取年、月和日,并将它们重新组合成一个日期,您可以与其他日期进行比较:

前缀xsd:
选择?dt?日期,其中{
值?dt{“2011-01-10T14:45:13.815-05:00”^^xsd:dateTime}
绑定(xsd:date)(concat(str(year(?dt)),“-”,
str(月(?dt)),“-”,
str(日(?dt)))
截止日期)
}
如果您想包含时区,也可以这样做;它们在xsd:dates中是允许的

如果希望在不创建新日期的情况下进行筛选,还可以执行以下操作

filter (year(?dt) = 2015 &&
        month(?dt) = 01 &&
        day(?dt) = 10)
这可能是一个相当干净的解决方案

FILTER (?date >= "2014-08-15T00:00:00Z"^^xsd:dateTime && ?date <= "2014-08-15T24:00:00Z"^^xsd:dateTime)
关于您的过滤器的注意事项。您可以像以前一样根据常量过滤变量的值,但这通常(但并非总是)建议一种更简单的方法。例如,代替:

select ?s where {
  ?s a ?o .
  filter ( ?o = <something> )
}
选择?s where{
是的。
过滤器(?o=)
}
通常只需使用就地值,或使用指定变量的值:

选择?s where{
这是一个好主意。
}
选择?s where{
值?o{}
是的。
}

您可以尝试对
xsd:date
进行简单转换,但SPARQL引擎可能会保留时间。因此这就成了解析的问题。一种方法是只使用
SUBSTR
,因为已知字符数:

FILTER (xsd:date(SUBSTR(str(?date), 0, 11)) = "2014-08-15"^^xsd:date)
另一种方法是根据datetime格式构建日期:

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

考虑到
CONCAT
需要字符串转换,可能不太方便,但一般的想法是从datetime值构建字符串并转换为
xsd:date

注意
“2014-08-15”^^xsd:datetime
可能不是合法的日期时间,即使它是合法的
xsd:date
。建议使用
改为“2014-08-15”^^xsd:date
。请注意substr解决方案(以及您和我都使用的字符串连接)有一个缺点,它们不包括时区,并且时区在xsd:dates中是允许的。我对所有的日期算法都不熟悉,但一个时区中的YYYY-MM-DD是否可能与另一个时区中的YYYY-MM-DD+1相同?保留这些时区可能很重要。是的,这似乎是一个不同的主题,并且非常依赖于n如何生成时间以及需要进行哪些比较。始终可以添加偏移量以达到UTC。