Коллеги, доброе утро!
В C# блоке бизнес-процесса выполняется следующий скрипт:

 Select caseDeadlineResponseSelect = new Select(userConnection).
         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, Column.Const(dateNow), new QueryColumnExpression("RegisteredOn"))/
         Func.DateDiff(DateDiffQueryFunctionInterval.Minute, new QueryColumnExpression("ResponseDate"), new QueryColumnExpression("RegisteredOn")))
всегда равен больше единицы. В обычном SQL, я бы произвел конвертацию делимого и делителя:
CONVERT(decimal(10,2),DATEDIFF(MINUTE, GETDATE(), RegisteredOn))/
CONVERT(decimal(10,2),DATEDIFF(MINUTE, ResponseDate, RegisteredOn))

Но как произвести конвертацию в C# блоке я не понял. Я использовал функцию CAST, но не смог подобрать DBDatValueType.
Подскажите, как все таки произвести вычислениях хотя бы до десятых долей.

Нравится

2 комментария

В принципе, можно вписать произвольный SQL-код через Column.SqlText.
Примеры работы с ним можно найти в конфигурации. Вот тут тоже работают с датами:

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<Guid>("TypeId").Equals(Terrasoft.Configuration.PurchaseConsts.ReturnTypeUId)) {
	campaignPurchaseQtyCountSelect
		.And("IsRewarded").IsEqual(Column.Parameter(false));
}

BEHOLD!!!!

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<float>();

В итоге выдаёт 0.6666667 на тестовом примере. Но эт жесть, конечно:smile:

Показать все комментарии