给定以下查询
let $a := xs:dateTime("2012-01-01T00:00:00.000+00:00")
let $b := xs:dateTime($a)
let $c := xs:dateTime($a cast as xs:string)
(: cannot - don't know how to - execute the function without assignment :)
let $d := adjust-dateTime-to-timezone($a, xs:dayTimeDuration("PT1H"))
return (<a>{$a}</a>,<b>{$b}</b>,<c>{$c}</c>)
输出如下
<a>2012-01-01T01:00:00+01:00</a>
<b>2012-01-01T01:00:00+01:00</b>
<c>2012-01-01T00:00:00Z</c>
基于XQuery 关于构造函数的文档(给定类型的构造函数用于将其他原子类型的实例转换为给定类型),这是预期的行为。调用xs:dateTime($a)只需返回$a,因为不需要强制转换,但xs:dateTime($a cast as xs:string)首先从$a 创建一个新的xs:string。但是,这需要额外的转换。
有没有其他方法可以解决这个问题?或者转换很便宜,我不应该关心?
(如果有什么不同,我的 XQuery 处理器是BaseX 7.2。)
看来我使用 BaseX确实有所不同。我真的认为这是xs:dateTime构造函数和adjust-dateTime-to-timezone函数应该工作的方式,这就是我误解 XQuery 文档的原因。
鉴于 Dimitre 和 Ranon 给我的意见,看来所描述的问题已经消失了。
由于我的用例是,或者更像是,我想对我的 XML 数据集的日期时间元素进行基于日期时间间隔的查询。因为输入参数和源日期时间值使用不同的时区,所以我必须使用上述函数进行时区更正,这修改了它的输入参数(在我的例子中是原始源日期时间),但是我想保留原始值。给定函数的名称adjust-dateTime我认为它可以修改它的参数,所以我自动认为我必须使用构造函数复制我的原始值才能保留原始日期时间值。