使用构造字符串

Using constructed string

我想知道为什么 werktwel 中的这个字符串很好,但 werktniet 中的字符串在我的查询中使用它们时却不行。

当我记录它们时,我看到了同样的事情; "2016-03-21*" 并且类型适用于 string 当我也记录它时。

// create data

declareUpdate();
xdmp.documentInsert(
       "/example.json",
       {"meting": "783", "bericht": "553", "plant": "01", "timestamp": "2016-03-21T22:32:30.361756"},
       xdmp.defaultPermissions(),
       xdmp.defaultCollections(),
       10)

// query
var nu = new Date();
var beteredatum = nu.getFullYear() + "-" + (Number(nu.getMonth())+1) + "-" + nu.getDate();
var werkniet = beteredatum + "*";
var werktwel = "2016-03-21*";
var a = cts.search(cts.jsonPropertyValueQuery("timestamp", werkniet, "wildcarded")).toArray();
xdmp.log(xdmp.type(werkniet));
a

我处理月份的方式不对。这样它工作正常。修复在 getMonth 的切片中。

// query

declareUpdate();
xdmp.documentInsert(
       "/example.json",
       {"meting": "783", "bericht": "553", "plant": "01", "timestamp": "2016-03-21T22:32:30.361756"},
       xdmp.defaultPermissions(),
       xdmp.defaultCollections(),
       10)

// query
var nu = new Date();
var beteredatum = nu.getFullYear() + "-" + ("0" + (nu.getMonth() + 1)).slice(-2) + "-" + nu.getDate();
var werkniet = beteredatum + "*";
var werktwel = "2016-03-21*";
var a = cts.search(cts.jsonPropertyValueQuery("timestamp", werkniet, "wildcarded")).toArray();
xdmp.log(xdmp.type(werkniet));
a

考虑使用 Date.toISOString():

var now = new Date(); // Mon Mar 21, 2016 
var isoNow = now.toISOString(); // 2016-03-21T12:20:56Z
var now2 = new Date(isoNow); // Mon Mar 21, 2016 

HTH!

你之前试过的时候,我怀疑那个月份是十月,十一月或者十二月。 (10,11,12)。请注意,您的修复程序还有一个“0”前缀,强制月份为 2 位或更多位数字,并转换为字符串。因此 slice(-2) 将始终产生最后 2 位数字。

不过,我建议尽可能使用内置的日期和日期时间函数,而不是字符串操作,尤其是对于子组件。 xs.date 和 xs.dateTime 的转换遵循 ISO8601 规范,这些规范用数字固定,因此更容易分解然后组合。 例如“2016-02-21T11:22:33.012-03:00”(日期时间)或“2016-01-21”

您将 dateTime 的日期 (beteredatum) 部分作为字符串获取的示例可以简化为

   var werkniet = fn.adjustDateToTimezone( fn.currentDate(), null ) + "*"

fn.substring( fn.currentDate()+"" , 0, 11)

  fn.formatDate(fn.currentDate(),"[Y0001]-[M01]-[D01]*")

如果您使用数字到字符串的转换,我建议使用定义明确的 fn.formatNumber(或 xdmp.formatNumber()),并为固定宽度提供 0 填充。

例如,将日期作为 0 填充数字

   fn.formatNumber(fn.dayFromDate( fn.currentDate() ),"00")

如果你坚持使用内置的 fn。或 xdmp。日期函数它们互操作性很好,没有 +/- 1,定义明确的字符串到数字或日期的转换,并为所有需要日期的 marklogic 函数生成正确的格式。