您可以这样做,但不完全按照您的问题提出的方式。 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> )
}
您通常只使用适当的值,或使用 values 来指定变量的值:
select ?s where {
?s a <something> .
}
select ?s where {
values ?o { <something> }
?s a ?o .
}