在计算列中返回UTCDatetime

时间:2015-03-12 10:45:05

标签: axapta dynamics-ax-2012 dynamics-ax-2012-r3

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

我有两个字段(日期和时间); time在内部存储为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

不起作用。

2 个答案:

答案 0 :(得分:1)

假设您有一个表MyTable,其字段TransDate的类型为Date,timeOffset的类型为int。

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

在视图中添加以下方法:

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

将计算字段的ViewMethod属性设置为calculateDateTime

现在,您可以按选择语句中的新计算字段进行分组:

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

Here是关于视图中计算字段的好文章。

答案 1 :(得分: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));

此代码输出的两个日期相同:2015年2月1日上午12:00:00(日/月/日)。

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