2012-07-25 27 views
0

我正在使用xdmp:document-filter(doc(uri))從文檔中提取元數據。當我在其中一個文檔上運行此命令時,我得到以下結果: -Marklogic中的日期格式問題

xdmp:document-filter(doc(「/ Vision.doc」))// *:meta [@name eq「Creation_Date」]/@內容

<?xml version="1.0" encoding="UTF-8"?> 
<results warning="attribute node"> 
    <warning warning="attributes cannot be root nodes" content="17-05-2012 00:48:00"/> 
</results> 

當我在另一個文件運行此命令,然後我得到這個: -

<?xml version="1.0" encoding="UTF-8"?> 
<results warning="attribute node"> 
    <warning warning="attributes cannot be root nodes" content="2012-06-03T13:45:00Z"/> 
</results> 

你可以看到,日期格式是在兩個輸出不同。在Marklogic Server中上傳的文檔中可能有不同的日期格式。但我想以某種固定格式顯示文檔的創建日期(例如2012年5月16日)。如何將不同的日期格式轉換爲固定的日期格式?而且我想將這些日期與用戶輸入的日期進行比較。搜索查詢應返回符合搜索條件的文檔。所以我在這裏有兩個問題: -

  1. 如何將特定文檔的創建日期轉換爲某種固定格式並將其顯示在UI中。
  2. 如何將此創建日期與用戶輸入的日期(使用「mm/dd/yyyy」格式)進行比較,以便我可以得到正確的結果。

回答

2

您將不得不解析dateTime值。例如:

let $dt := "17-05-2012 00:48:00" 
return 
    if ($dt castable as xs:dateTime) 
    then xs:dateTime($dt) 
    else xdmp:parse-dateTime("[Y01]-[M01]-[D01] [h01]:[m01]:[s01]", $dt) 

這將返回一個xs:dateTime原子值,其可以被比較,並在用戶界面中顯示。如果您想支持其他格式,則需要創建附加的解析「圖片」字符串,以便它們也可以轉換爲xs:dateTime。有關更多信息,請參閱xdmp:parse-dateTime()上的文檔。

+0

此查詢返回以下輸出: - <?xml version =「1.0」encoding =「UTF-8」?> 2022-11-02T00:00:00 + 05: 30這不是有效的日期時間值,我只想顯示日期。我不想要約會時間。 – 2012-07-26 06:06:34

+0

@Puneet - 這實際上是一個有效的日期時間值。它是[XML Schema](http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#dateTime)中定義的一個,它是MarkLogic在索引中支持的類型。使用原子類型,您可以使用xdmp dateTime函數創建帶格式的字符串 - 例如:'fn:format-dateTime(xs:dateTime(「2022-11-02T00:00:00 + 05:30」),「[Y01]/[M01]/[D01]「)=> 22/11/02' – wst 2012-07-27 00:28:53

1

作爲一個更大的開源項目的一部分,我製作了一個日期解析庫,它可以處理6種不同語言中的至少20種不同格式。如果還沒有定義,你也可以提供你自己的格式。它的工作原理是將任何定義格式的日期作爲字符串輸入,並返回xs:dateTime,如果它能夠成功解析它。你可以在這裏找到庫:

https://github.com/marklogic/Corona/blob/master/corona/lib/date-parser.xqy

要使用它:

import module namespace dateparser="http://marklogic.com/dateparser" at "date-parser.xqy"; 

dateparser:parse($filteredDocument//*:meta[@name eq "Creation_Date"]/@content) 

這將讓你一定要規範各種日期格式,二進制文檔可以有。我會注意到不同的二進制格式(Word,PDF,JPEG等)將使用不同的名稱作爲創建日期。因此,只要查找「Creation_Date」元數據可能會留下一些漏洞,具體取決於您在MarkLogic中存儲的格式。

另請注意,如果您只想要沒有時間部分的日期信息,則可以將xs:dateTime投射到xs:date。這樣做會保留時區信息,這可能是一件好事。

關於你的第二個問題......

有許多不同的方法可以做到這一點,讀一些MarkLogic文檔是一個良好的開端。我建議考慮看看:

http://docs.marklogic.com/guide/search-dev/rangequery

希望這將灑下一點光對您的查詢需要什麼樣子。以最簡單的形式,您可能必須首先解析用戶提供的日期。這也可以通過日期解析庫來完成,因此用戶可以輸入大量不同的日期格式(例如:2012年11月13日,甚至2012年11月13日西班牙文)。然後使用解析日期在MarkLogic中構建日期範圍查詢。

如果這沒有幫助,我會在這裏提出另一個問題,在那裏你掛斷的具體細節。