如何在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
不起作用。
答案 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作为字符串返回。