次のクエリが与えられた
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がxs:stringとしてキャスト)は、最初に$ aから 新しいxs:stringを作成します。ただし、これには追加の変換が必要です。
この問題に取り組む他の方法はありますか?または、変換は安価で、気にしないでください。
(違いがある場合、私のXQueryプロセッサはBaseX 7.2です。)
BaseXを使用していることが違いを生むようです。これがxs:dateTimeコンストラクター関数とadjust-dateTime-to-timezone関数が機能する方法であると本当に思っていたので、XQueryのドキュメントを誤って解釈しました。
私がDimitreとRanonから与えられた入力を考えると、説明されている問題はなくなったようです。
私のユースケースが、またはそれと同じように、 XMLデータセットの日時要素に対して日時間隔ベースのクエリを作成したかった理由です。入力パラメーターとソース日時の値が異なるタイムゾーンを使用しているため、上記の関数を使用してタイムゾーンを修正する必要がありました。これにより、入力パラメーター(私の場合は元のソース日時)が変更されましたが、元の値を保持します。関数の名前adjust-dateTimeを考えると、引数を変更しても問題ないと思ったので、元の日時値を保持できるようにするには、コンストラクター関数を使用して元の値をコピーする必要があると自動的に考えました。