1

我想知道为什么这个字符串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
4

3 回答 3

4

考虑使用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 

于 2016-03-21T11:24:07.653 回答
2

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

但是,我建议尽可能使用内置的 date 和 dateTime 函数,而不是字符串操作,尤其是对于子组件。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 函数生成正确的格式。

于 2016-03-21T11:45:43.110 回答
1

我这几个月的工作方式并不好。这样它工作正常。修复在 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
于 2016-03-21T09:36:09.057 回答