Reputation: 101
Select
sum(
CASE
WHEN e01f04 < '2024-02-01' THEN DATEDIFF(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY), '2024-02-01') + 1
WHEN ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) > '2024-02-29' THEN DATEDIFF(e01f04, '2024-02-29') + 1
ELSE DATEDIFF(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY), e01f04) + 1
END
) AS Leave_Count
, E01F06
FROM
lve01
where
e01f02 = 1
AND
e01f07 = 2
AND
(e01f04 >= '2024-02-01' AND
e01f04 <= '2024-02-29')
OR
(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) >= '2024-02-01' AND
ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) <= '2024-02-29');
e01f02 - employeeId
e01f04 - leave start date
ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) - leave last date
e01f05 - no. of leaves
e01f07 - leave status (where 2 = approved)
Code explaination - Above query is to get total approved leave count for feb-2024 for employeeId = 1
How can I perform the above query using ORMLite functionalities or query?
UPDATE
SqlExpression<LVE01> sqlExp = db.From<LVE01>()
.Where(l => l.e01f02 == EmployeeId && l.e01f07 == LeaveStatus.Approved)
.Where($"(e01f04 >= '{MonthFirstDate}' AND e01f04 <= '{MonthLastDate}')")
.Or($"(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) >= '{MonthFirstDate}' AND ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) <= '{MonthLastDate}')");
sqlExp.SelectExpression = $"SELECT sum( CASE WHEN e01f04 < '{MonthFirstDate}' THEN DATEDIFF(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY), '{MonthFirstDate}') + 1 WHEN ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) > '{MonthLastDate}' THEN DATEDIFF(e01f04, '{MonthLastDate}') + 1 ELSE DATEDIFF(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY), e01f04) + 1 END) AS Leave_Count";
I tried and was able to create query using ORMLite, but certainly I needed to use mysql query literals at some place (like select expression).
Can I make the query more function based?
Upvotes: 1
Views: 53
Reputation: 143284
You would need to use Custom SQL as you're doing, but you should be able to use a typed expression to compare DateTime's, I'd recommend using DB parameters instead of string interpolation and you can use UnsafeSelect
instead of populating SelectExpression
, e.g:
var q = db..From<LVE01>()
.Where(l => l.e01f02 == EmployeeId && l.e01f07 == LeaveStatus.Approved)
.And(x => x.e01f04 >= MonthFirstDate && x.e01f04 <= MonthLastDate)
.Or("(ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) >= {0} AND ADDDATE(e01f04, INTERVAL (e01f05 - 1) DAY) <= {1})",
MonthFirstDate, MonthLastDate)
.UnsafeSelect("sum(CASE WHEN e01f04...");
Upvotes: 1