Коллеги, доброе утро!
В 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;
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")))
Func.DateDiff(DateDiffQueryFunctionInterval.Minute, new QueryColumnExpression("ResponseDate"), new QueryColumnExpression("RegisteredOn")))
CONVERT(decimal(10,2),DATEDIFF(MINUTE, GETDATE(), RegisteredOn))/
CONVERT(decimal(10,2),DATEDIFF(MINUTE, ResponseDate, RegisteredOn))
CONVERT(decimal(10,2),DATEDIFF(MINUTE, ResponseDate, RegisteredOn))
Но как произвести конвертацию в C# блоке я не понял. Я использовал функцию CAST, но не смог подобрать DBDatValueType.
Подскажите, как все таки произвести вычислениях хотя бы до десятых долей.
Нравится
2 комментария
20 февраля 2017 11:40
В принципе, можно вписать произвольный 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)); }
20 февраля 2017 13:35
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:
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать