使用XQuery将日期输入转换为特定格式的字符串值

使用XQuery将日期输入转换为特定格式的字符串值,xquery,Xquery,我必须使用xquery创建DDMMYYYY格式的日期字符串。我的xquery输入的日期类似于“2004-05-02T00:00:00+01:00”。到目前为止,我正在使用以下解决方案从AT(02052004)获取所需的 是否有其他方法或内置函数可用于将日期转换为所需的字符串格式?您可以尝试以下方法: fn:dateTime格式(xs:dateTime($dateInput),“[M01][D01][Y0001]”) 要生成02052004,如果您使用的是XQuery 1.0处理器,它将非常复杂。

我必须使用xquery创建DDMMYYYY格式的日期字符串。我的xquery输入的日期类似于“2004-05-02T00:00:00+01:00”。到目前为止,我正在使用以下解决方案从AT(02052004)获取所需的


是否有其他方法或内置函数可用于将日期转换为所需的字符串格式?

您可以尝试以下方法:

fn:dateTime格式(xs:dateTime($dateInput),“[M01][D01][Y0001]”)


要生成02052004,如果您使用的是XQuery 1.0处理器,它将非常复杂。有类似于
fn:day-from-dateTime()
的函数可用,但是对于10以下的数字,会返回一个数字,这很可能不是您想要的

您可以编写一个简单的填充函数

declare function local:pad($number as xs:integer) as xs:string
{
  if ($number<10)
  then concat("0", $number)
  else xs:string($number)
};
如果您的处理器支持XQuery 3.0,则可以使用
fn:format-dateTime()
,并允许更轻松地格式化。有关格式规则,请访问。对于所需的输出,应采用以下方法:

fn:format-dateTime(xs:dateTime($dateInput),"[D01][M01][Y}")

如果您已经访问了XQuery 3.0,您可以利用
格式dateTime($date,$picture)

如果没有(仅XQuery 1.0),您仍然可以使用更具语义的版本。由于它也没有
格式编号(…)
函数,因此我使用了functx中准备的一些函数:

declare namespace functx = "http://www.functx.com";
declare function functx:pad-integer-to-length
  ( $integerToPad as xs:anyAtomicType? ,
    $length as xs:integer )  as xs:string {

   if ($length < string-length(string($integerToPad)))
   then error(xs:QName('functx:Integer_Longer_Than_Length'))
   else concat
         (functx:repeat-string(
            '0',$length - string-length(string($integerToPad))),
          string($integerToPad))
 } ;

 declare function functx:repeat-string
  ( $stringToRepeat as xs:string? ,
    $count as xs:integer )  as xs:string {

   string-join((for $i in 1 to $count return $stringToRepeat),
                        '')
 } ;

let $date := xs:dateTime("2004-05-02T00:00:00+01:00")
let $date := xs:date($date)
return string-join((
  functx:pad-integer-to-length(day-from-date($date), 2),
  functx:pad-integer-to-length(month-from-date($date), 2),
  functx:pad-integer-to-length(year-from-date($date), 4)
))
声明命名空间functx=”http://www.functx.com";
将函数functx:pad integer声明为长度
($integerToPad作为xs:anyAtomicType,
$length作为xs:integer)作为xs:string{
if($length<字符串长度(字符串($integerToPad)))
然后出现错误(xs:QName('functx:Integer\u Longer\u Than\u Length'))
艾尔斯康卡特
(functx:重复字符串(
“0”,$length-字符串长度(字符串($integerToPad)),
字符串($integerToPad))
} ;
声明函数functx:重复字符串
($stringToRepeat为xs:string,
$count as xs:integer)as xs:string{
字符串联接((对于$i in 1到$count返回$stringToRepeat),
'')
} ;
让$date:=xs:dateTime(“2004-05-02T00:00:00+01:00”)
let$date:=xs:date($date)
返回字符串联接((
functx:pad整数到长度(从日期算起的日期($date),2),
functx:pad整数到长度(从日期开始的月份($date),2),
functx:pad整数到长度(从日期算起的年份($date),4)
))
您可以自己决定是喜欢更大但语义更丰富的版本还是简单的字符串操作。请注意,时区可能会导致不同的结果,具体取决于您选择的时区。

您可以参考此网站-。刚刚更改了函数的最后一行-$3-$2-$1

declare namespace functx = "http://www.functx.com";
declare function functx:mmddyyyy-to-date
       ( $dateString as xs:string? )  as xs:date? {

       if (empty($dateString))
       then ()
       else if (not(matches($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$')))
       then error(xs:QName('functx:Invalid_Date_Format'))
       else xs:date(replace($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$',
                    '$3-$2-$1'))
       } ;
用法:

functx:mmddyyyy至今('31-01-2004')

输出

2004-01-31

let $date := xs:dateTime("2004-05-02T00:00:00+01:00")
return format-dateTime($date, "[D,2][M,2][Y,4]")
declare namespace functx = "http://www.functx.com";
declare function functx:pad-integer-to-length
  ( $integerToPad as xs:anyAtomicType? ,
    $length as xs:integer )  as xs:string {

   if ($length < string-length(string($integerToPad)))
   then error(xs:QName('functx:Integer_Longer_Than_Length'))
   else concat
         (functx:repeat-string(
            '0',$length - string-length(string($integerToPad))),
          string($integerToPad))
 } ;

 declare function functx:repeat-string
  ( $stringToRepeat as xs:string? ,
    $count as xs:integer )  as xs:string {

   string-join((for $i in 1 to $count return $stringToRepeat),
                        '')
 } ;

let $date := xs:dateTime("2004-05-02T00:00:00+01:00")
let $date := xs:date($date)
return string-join((
  functx:pad-integer-to-length(day-from-date($date), 2),
  functx:pad-integer-to-length(month-from-date($date), 2),
  functx:pad-integer-to-length(year-from-date($date), 4)
))
declare namespace functx = "http://www.functx.com";
declare function functx:mmddyyyy-to-date
       ( $dateString as xs:string? )  as xs:date? {

       if (empty($dateString))
       then ()
       else if (not(matches($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$')))
       then error(xs:QName('functx:Invalid_Date_Format'))
       else xs:date(replace($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$',
                    '$3-$2-$1'))
       } ;