-
Notifications
You must be signed in to change notification settings - Fork 0
Date Range
Akash Kava edited this page Jun 27, 2022
·
4 revisions
In EAC, we cannot perform Group By on subquery with filters, we need to join table with DateRangeView function to achieve certain reporting.
This is limitation by SQL Server.
Alternative is to create a cross join with DateRangeView(start, end, step) function which will return actual rows and you can then perform sum/count over query within given date range.
// make sure you retrieve only one object
this.entityService.Query(Account)
.joinDateRange(start, end, "Day")
.select((x) => ({
posts: x.entity.posts.where((p) => p.dateCreated >= x.range.startDate
&& p.dateCreated < x.range.endDate).count(),
reviews: x.entity.reviews.where((r) => r.dateCreated >= x.range.startDate
&& r.dateCreated < x.range.endDate).count()
});
Create DateRangeView SQL Script
CREATE FUNCTION [dbo].[DateRangeView]
(
-- Add the parameters for the function here
@start DateTime2,
@end DateTime2,
@step nvarchar(20) = 'Day'
)
RETURNS TABLE
AS
RETURN (
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 1*10^1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
cteTally10000(N) AS (SELECT TOP (
CASE
WHEN @step = 'Year' THEN DATEDIFF(YEAR, @start, @end)
WHEN @step = 'Quarter' THEN DATEDIFF(QUARTER, @start, @end)
WHEN @step = 'Month' THEN DATEDIFF(MONTH, @start, @end)
WHEN @step = 'Week' THEN DATEDIFF(WEEK, @start, @end)
WHEN @step = 'Day' THEN DATEDIFF(DAY, @start, @end)
WHEN @step = 'Hour' THEN DATEDIFF(Hour, @start, @end)
WHEN @step = 'Year' THEN DATEDIFF(YEAR, @start, @end)
ELSE DATEDIFF(DAY, @start, @end)
END
) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2)
SELECT StartDate = CASE
WHEN @step = 'Year' THEN DATEADD(YEAR, N-1, @start)
WHEN @step = 'Quarter' THEN DATEADD(QUARTER, N-1, @start)
WHEN @step = 'Month' THEN DATEADD(MONTH, N-1, @start)
WHEN @step = 'Week' THEN DATEADD(WEEK, N-1, @start)
WHEN @step = 'Day' THEN DATEADD(DAY, N-1, @start)
WHEN @step = 'Hour' THEN DATEADD(Hour, N-1, @start)
WHEN @step = 'Year' THEN DATEADD(YEAR, N-1, @start)
ELSE DATEADD(DAY, N-1, @start)
END,
EndDate = CASE
WHEN @step = 'Year' THEN DATEADD(YEAR, N, @start)
WHEN @step = 'Quarter' THEN DATEADD(QUARTER, N, @start)
WHEN @step = 'Month' THEN DATEADD(MONTH, N, @start)
WHEN @step = 'Week' THEN DATEADD(WEEK, N, @start)
WHEN @step = 'Day' THEN DATEADD(DAY, N, @start)
WHEN @step = 'Hour' THEN DATEADD(Hour, N, @start)
WHEN @step = 'Year' THEN DATEADD(YEAR, N, @start)
ELSE DATEADD(DAY, N, @start)
END
FROM cteTally10000)