0

如何在 AX 视图的计算列中返回 UTCDateTime?

我有两个字段(日期和时间);时间在内部存储为 int (从午夜开始的秒数)。要删除重复项,我需要将其转换为 UTCDateTime 并尝试在计算列中实现这一点。

比较日期和时间不起作用,因为数据库中的 1.1.15 24:00 和 2.1.15 0:00 不同(1.1.15; 86400 和 2.1.15;0),尽管它最终是相同的时间戳。

在 select 语句中计算 DateTime 甚至会更容易,但也是这样的

while select
        count(RecId)
        , sum(delta)
        //, TransDate
        //, timeOffset
        , DateTimeUtil::addSeconds(DateTimeUtil::newDateTime(myTable.TransDate, 0, DateTimeUtil::getClientMachineTimeZone()), myTable.timeOffset)
        , timestamp
        , WrkCtrid
        , calendarId
    from
        myTable
    group by
        WrkCtrid
        //, TransDate
        //, timeOffset
        , DateTimeUtil::addSeconds(DateTimeUtil::newDateTime(myTable.TransDate, 0, DateTimeUtil::getClientMachineTimeZone()), myTable.timeOffset)
        , timestamp

不起作用。

4

2 回答 2

1

假设您有一个表,其中包含Date类型和 int类型MyTable的字段。TransDatetimeOffset

创建一个视图,MyView然后将此表添加到数据源。创建新的 utcDateTime 计算字段DateAndTimeOffset

在视图中添加以下方法:

public static server str calculateDateTime()
{
    return "DATEADD(ss,timeOffset,TransDate)";
}

ViewMethod计算域的属性设置为calculateDateTime

现在,您可以按 select 语句中的新计算域进行分组:

MyView myView;
while select myView group by myView.DateAndTimeOffset
{
    info(strFmt('%1',myView.DateAndTimeOffset));
}

是一篇关于视图中计算域的好文章。

于 2015-03-12T13:32:49.880 回答
0

我不太明白您对比较日期和时间的要求是什么,因为您概述的情况是由 dateTimeUtil (X++) 处理的:

int maximum = 86400;
int minimum = 0;
date d1 = 01\01\2015;
date d2 = 02\01\2015;

utcDateTime one;
utcDateTime two;

one = DateTimeUtil::newDateTime(d1, maximum);
two = DateTimeUtil::newDateTime(d2, minimum);

info(strFmt("%1,   %2", one, two));

此代码输出的两个日期都是相同的:2/1/2015 12:00:00 am (dd/mm/yyyy)。

因此,我们可以使用 SysComputedColumn::returnField 获取日期和时间字段,并将它们本地插入 DateTimeUtil::newDateTime,然后使用 strFmt 在计算列方法中将日期时间作为字符串返回。

于 2015-04-07T20:54:47.143 回答