Коллеги, доброе утро!
В C# блоке бизнес-процесса выполняется следующий скрипт:
Column("Case", "id").As("CaseId").
From("Case").
Where("Case", "StatusId").IsEqual(Column.Parameter(caseStatusNew))
.And("Case", "NrbSentDeadlineResponse").IsEqual(Column.Parameter("0"))
.And(Func.DateDiff(DateDiffQueryFunctionInterval.Minute, Column.Const(dateNow), new QueryColumnExpression("RegisteredOn"))/
Func.DateDiff(DateDiffQueryFunctionInterval.Minute, new QueryColumnExpression("ResponseDate"), new QueryColumnExpression("RegisteredOn"))).IsGreaterOrEqual(Column.Parameter(0.9))
as Select;
Проблема в том, что в блоке WHERE в частности где идет идет деление дат, происходит округление в большую сторону, т.о как правило результат выражения
Func.DateDiff(DateDiffQueryFunctionInterval.Minute, new QueryColumnExpression("ResponseDate"), new QueryColumnExpression("RegisteredOn")))
CONVERT(decimal(10,2),DATEDIFF(MINUTE, ResponseDate, RegisteredOn))
Но как произвести конвертацию в C# блоке я не понял. Я использовал функцию CAST, но не смог подобрать DBDatValueType.
Подскажите, как все таки произвести вычислениях хотя бы до десятых долей.
Нравится
В принципе, можно вписать произвольный SQL-код через Column.SqlText.
Примеры работы с ним можно найти в конфигурации. Вот тут тоже работают с датами:
[csharp]
var campaignPurchaseQtyCountSelect = new Select(UserConnection)
.Column(Func.Count("Id"))
.From("CampaignPurchaseQtyCount")
.Where("CampaignId").IsEqual("Campaign", "Id")
.And("CardId").IsEqual(Column.Parameter(cardId))
.And(Column.SqlText("DATEDIFF(D, 0, [PurchaseDate])")).IsEqual(Column.SqlText("DATEDIFF(D, 0, @purchaseDate)"));
if (purchaseEntity.GetTypedColumnValue("TypeId").Equals(Terrasoft.Configuration.PurchaseConsts.ReturnTypeUId)) {
campaignPurchaseQtyCountSelect
.And("IsRewarded").IsEqual(Column.Parameter(false));
}
[/csharp]
BEHOLD!!!!
[csharp]
DBDataValueType valueType = userConnection.DataValueTypeManager.GetInstanceByUId(DataValueType.FloatDataValueTypeUId) as DBDataValueType;
DateDiffQueryFunction diff1 = Func.DateDiff(DateDiffQueryFunctionInterval.Day, Column.Const(DateTime.UtcNow), new QueryColumnExpression("CreatedOn")),
diff2 = Func.DateDiff(DateDiffQueryFunctionInterval.Day, new QueryColumnExpression("TmResponseDate"), new QueryColumnExpression("CreatedOn"));
QueryColumnExpression exp1 = new QueryColumnExpression(diff1), exp2 = new QueryColumnExpression(diff2);
CastQueryFunction cast1 = Func.Cast(exp1, valueType), cast2 = Func.Cast(exp2, valueType);
QueryColumnExpression exp3 = new QueryColumnExpression(cast1), exp4 = new QueryColumnExpression(cast2);
QueryColumnExpression result = QueryColumnExpression.Divide(exp3, exp4);
Select decSelect = new Select(userConnection).Top(1)
.Column(result)
.From("TmNews")
as Select;
return decSelect.ExecuteScalar();
[/csharp]
В итоге выдаёт 0.6666667 на тестовом примере. Но эт жесть, конечно:smile: