XQuery には、日付変換に役立つ一連の関数があります。しかし、「今日」や「昨日」などの相対的な日付を実際の日付に変換するにはどうすればよいでしょうか?
たとえば、「今日、17:33」は「2012-05-30」に、「昨日、22:13」は「2012-05-29」に変換する必要があります。
日付文字列を解析します。日付を示す単語を分割して解析する小さな関数を提供しました。日付にもっと便利な名前をいくつか追加しましたが、必要に応じて簡単に追加できます。小文字に変換することに注意してください。一致する日付を計算するためにXQueryの日付と時刻の関数を使用します。
declare function local:from-relative-date($string as xs:string) as xs:date {
switch (lower-case(substring-before($string, ",")))
case "today" return current-date()
case "yesterday" return current-date() - xs:dayTimeDuration('P1D')
case "day before yesterday" return current-date() - 2 * xs:dayTimeDuration('P1D')
case "tomorrow" return current-date() + xs:dayTimeDuration('P1D')
case "day after tomorrow" return current-date() + 2 * xs:dayTimeDuration('P1D')
default return error(xs:QName("XPTY0004"), "Unknown Date")
};
次に、XQuery 3.0関数を使用してformat-date(...)
(XQueryエンジンがサポートしていることを願っていますが、この例で使用したBaseXはサポートしています)、必要に応じて日付文字列をフォーマットします。
format-date(local:from-relative-date("Yesterday, 22:13"), "[Y]-[M00]-[D00]")
そうでない場合は、月と日year-from-date(...)
の関数を使用してそれに応じて、いくつかの数値フォーマットを使用して、自分で連結する必要があります。