Use datediff() result in dsum() function - sql

I have the following table with start and end dates:
dataid TS EndTS
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM
I would like to get the date/time interval (in seconds) and then calculate a running total.
Here is what I have so far:
SELECT
[dataid] AS [dataid]
DateDiff("s", [TS],[EndTS]) AS [durationsec]
DSum("[durationsec]","[HX32]","[dataid] <=" & [dataid]) AS [add]
FROM [HX32];
I think the datediff() funtion is possibly causing formatting problems. With "[durationsec]" I get all nulls as a result, with [durationsec] I get the following results:
durationsec add
4 6896
3 5169
8 13776
7 12047
12 20640
7 12033
19 32642
I also tried cint(DateDiff("s", [TS],[EndTS])) No change.
I also tried passing durationsec to a table and running a seperate query. No change. (Also I would prefer to do this all in one query)
Here are the results I would like to achieve:
dataid TS EndTS durationsec add
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM 4 60
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM 3 56
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM 8 53
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM 7 45
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM 12 38
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM 7 26
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM 19 19
Thanks, I'm a beginner.

Time is not seconds but integer days, so you could try:
SELECT
[dataid],
DateDiff("s", [TS], [EndTS]) AS [durationsec],
DSum("[EndTS]-[TS]", "[HX32]", "[dataid] <= " & [dataid] & "") * 86400 AS [add]
FROM
[HX32];
That said, June's method should work as well. If both fail, something else is going on.

SELECT dataid,
startts,
endts,
DATEDIFF("s", startts,endts) AS durationsec,
SUM(DATEDIFF("s", startts,endts)) OVER (ORDER BY endts ROWS UNBOUNDED PRECEDING) AS runningtotal
FROM durtab
ORDER BY 5 DESC;
Result:
dataid startts endts durationsec runningtotal
1744 2017-07-27 13:57:34.000 2017-07-27 13:57:38.000 4 60
1743 2017-07-27 13:57:31.000 2017-07-27 13:57:34.000 3 56
1742 2017-07-27 13:57:23.000 2017-07-27 13:57:31.000 8 53
1741 2017-07-27 13:57:16.000 2017-07-27 13:57:23.000 7 45
1740 2017-07-27 13:57:04.000 2017-07-27 13:57:16.000 12 38
1739 2017-07-27 13:56:57.000 2017-07-27 13:57:04.000 7 26
1738 2017-07-27 13:56:38.000 2017-07-27 13:56:57.000 19 19

DSum is looking at the [HX32] table or query to find a field named [durationsec]. It doesn't exist there.
SELECT
[dataid],
DateDiff("s",[TS],[EndTS]) AS [durationsec],
DSum("DateDiff('s',[TS],[EndTS])","[HX32]","[dataid] <=" & [dataid]) AS [add]
FROM [HX32];`
Note the use of apostrophes to delimit the 's' parameter in the nested DateDiff.
An alternative approach is to do the running sum in Report because textbox in report has a RunningSum property. Domain aggregate functions in queries can perform slowly in large datasets.

Related

Add Time Together From Previous Row in Microsoft Access

I am using Microsoft Access 2016 and I have a table where the goal is using the provided start time for each date, add the given Slot to the Start to calculate the End time. Where I am having difficulties is where Start is null, it is to pull the previous records' End time as its Start time and repeat the process.
Below is a sample table of data:
Day
PrimaryKey
AbovePrimaryKey
Start
Slot
End
9/19/2022
171
4:00:00 PM
2:30
9/19/2022
172
171
2:30
9/19/2022
173
172
1:30
9/20/2022
174
173
11:00:00 AM
1:30
9/20/2022
175
174
1:30
9/20/2022
176
175
2:30
9/20/2022
177
176
2:30
9/20/2022
178
177
1:00
9/20/2022
179
178
1:00
Below is what I am wanting as the result:
Day
PrimaryKey
Start
Slot
End
9/19/2022
171
4:00:00 PM
2:30
6:30:00 PM
9/19/2022
172
6:30:00 PM
2:30
8:30:00 PM
9/19/2022
173
8:30:00 PM
1:30
10:00:00 PM
9/20/2022
174
11:00:00 AM
1:30
12:30:00 PM
9/20/2022
175
12:30:00 PM
1:30
2:00:00 PM
9/20/2022
176
2:00:00 PM
2:30
4:30:00 PM
9/20/2022
177
4:30:00 PM
2:30
7:00:00 PM
9/20/2022
178
7:00:00 PM
1:00
8:00:00 PM
9/20/2022
179
8:00:00 PM
1:00
9:00:00 PM
I was able to get the previous row's primary key to use in reference in some subquery to pull the previous row's End, but am unable to determine how to do so, especially since I have also have to calculate Start and End.
Any help would be greatly appreciated. Thank you.
You can do this with four sets of subqueries:
SELECT
SampleData.Day,
SampleData.PrimaryKey,
(Select S2.Start
From SampleData As S2
Where S2.PrimaryKey =
(Select Max(S.PrimaryKey)
From SampleData As S
Where S.Start Is Not Null And S.PrimaryKey <= SampleData.PrimaryKey)) +
(Select CDate(IIf(Sum(S3.Slot) Is Null, #00:00#, Sum(S3.Slot)))
From SampleData As S3
Where S3.PrimaryKey < SampleData.PrimaryKey And S3.PrimaryKey >=
(Select Max(S.PrimaryKey)
From SampleData As S
Where S.Start Is Not Null and S.PrimaryKey <= SampleData.PrimaryKey)) As [Start],
SampleData.Slot,
(Select S2.Start
From SampleData As S2
Where S2.PrimaryKey =
(Select Max(S.PrimaryKey)
From SampleData As S
Where S.Start Is Not Null And S.PrimaryKey <= SampleData.PrimaryKey)) +
(Select CDate(Sum(S3.Slot))
From SampleData As S3
Where S3.PrimaryKey <= SampleData.PrimaryKey And S3.PrimaryKey >=
(Select Max(S.PrimaryKey)
From SampleData As S
Where S.Start Is Not Null And S.PrimaryKey <= SampleData.PrimaryKey)) As [End]
FROM
SampleData;
Output:

SQL sort by each hour with different dates

I have a sql table like this
occ_val time
0 2/1/2022 3:35:08 pm
1 2/1/2022 3:59:08 pm
2 2/1/2022 4:55:08 pm
3 2/1/2022 5:32:08 pm
2 3/1/2022 4:43:08 pm
3 4/1/2022 2:15:08 pm
How to I sort by each hour to get this:
time occ_val
2:00:00 pm 3
3:00:00 pm 1
4:00:00 pm 4
5:00:00 pm 3
Your help is very much appreciated :D
Here is a MySQL solution:
select DATE_FORMAT(min(time), '%h:00'),sum(occ_val) from tbl group by hour(time)
See https://www.db-fiddle.com/f/czudbp5zug6HxX4TFV26GT/0
SELECT * from YourTableName
ORDER BY (timeCol - FLOOR(CAST(timeCol AS float)) ASC

Find difference in hours passing parameter value for specific date

This is my table data:
Fromdatetime Todatetime
2018-12-8 10:25 AM 2018-12-8 16:25 PM
2018-12-8 16:25 PM 2018-12-8 20:25 PM
2018-12-8 20:25 PM 2018-12-9 01:25 AM
2018-12-9 01:25 AM 2018-12-10 23:25 PM
Here is my list of parameter value:
2018-12-8 10:25 AM to 2018-12-9 10:25Am
2018-12-9 10:25 AM to 2018-12-10 10:25AM
For 1 parameter my output should be:
It should returned me 4 first row data Hours difference by substarcting fromdatetime and Todatetime
But in case of 4th row my hours should only calculate the difference of fromdatetime and Todatetime
Example result should be
Hours
6
4
5
9
So can you please help me to write this query
Are you simply looking for datediff()?
select datediff(hour, Fromdatetime, Todatetime) as num_hours

how to get no of transactions on an hourly range

Table has columns Receiptno: and [TransDate] and Transtime. eg: Data below
0080052594 2012-10-28 1899-12-30 19:01:38.000
0080052595 2012-10-28 1899-12-30 19:05:09.000
0080052596 2012-10-28 1899-12-30 19:05:15.000
I need query to get hourly interval and the no: of transactions in the below format
Hour Inetrval No: Trans
09:01-10:00 10
10:01-11:00 16
Which DBMS are you using? What specific data type are your fields?
In Access, you'd use a Totals query (GROUP BY in SQL), you could do it using an additional field (or layered queries). You could also use inline code string comparisons. This would work with string or DateTime fields for transaction date and time.
For example, TABLE1:
RECEIPTNO TRANSDATE TRANSTIME
1 1/12/2015 4:32:00 PM
2 1/12/2015 4:45:00 PM
3 1/12/2015 4:52:00 PM
4 1/12/2015 3:57:00 PM
5 1/12/2015 4:07:00 PM
6 1/12/2015 4:09:00 PM
7 1/12/2015 6:15:00 PM
8 1/12/2015 12:34:00 PM
9 1/12/2015 2:45:00 PM
10 1/12/2015 3:15:00 PM
11 1/12/2015 3:17:00 PM
12 1/12/2015 3:49:00 PM
13 1/12/2015 3:47:00 PM
14 1/12/2015 2:52:00 PM
15 1/12/2015 2:36:00 PM
16 1/12/2015 2:17:00 PM
17 1/12/2015 2:25:00 PM
18 1/12/2015 4:12:00 PM
QUERY1 to count by hour as string:
SELECT Count(TABLE1.RECEIPTNO) AS CountOfRECEIPTNO, TABLE1.TRANSDATE, Left([TRANSTIME],InStr([TRANSTIME],":")-1) AS [HOUR]
FROM TABLE1
GROUP BY TABLE1.TRANSDATE, Left([TRANSTIME],InStr([TRANSTIME],":")-1)
ORDER BY Left([TRANSTIME],InStr([TRANSTIME],":")-1);
Results:
CountOfRECEIPTNO TRANSDATE HOUR
1 1/12/2015 12
5 1/12/2015 2
5 1/12/2015 3
6 1/12/2015 4
1 1/12/2015 6

SQL code for Comparing date fields in different rows and combining the results

I need help for proper Oracle SQL code to combine rows for a crystal reports command object. This is a part of the bigger query I'm working on and got stuck for the past couple of days.
for eg. if the columns are like below
PatId In_time Out_time
151 01/01/2012 07:00:00 am 01/01/2012 10:00:00 am
151 01/01/2012 11:00:00 am 01/02/2012 08:00:00 am
151 01/02/2012 11:00:00 am 01/02/2012 01:00:00 pm
151 01/03/2012 08:00:00 am 01/03/2012 03:00:00 pm
151 01/06/2012 03:30:00 pm 01/09/2012 07:00:00 am
167 01/03/2012 01:30:00 pm 01/09/2012 07:00:00 am
167 01/13/2012 03:30:00 pm 01/14/2012 07:00:00 am
167 01/14/2012 11:30:00 am 01/15/2012 11:30:00 am
167 01/18/2012 12:00:00 pm 01/19/2012 03:00:00 am
Within a PatId, the code should compare the Out_time of one row to the In_time of the next row, and check whether the time gap is greater than 48 hours. If not, then it is considered part of the same visit. I want one result row per PatID & visit, with min(In_time) and max(Out_time). The time span of the visit (result row) itself may be greater than 48 hours.
For this example, for PatId 151 the time difference between the out_time of 1st row and In_time of 2nd row is less than 48 hours. The difference between Out_time of second row and In_time of 3rd row, as well as between the 3rd and 4th rows, is also less than 48 hours. After this the gap between Out_time of the 4th row and In_time of 5th row is greater than 48 hours. The result for PatId 151 should be as below and same for EmpId 167, the chaining should continue until a gap greater than 48 hours is found.
So the result for the above table should be displayed as,
PatId In_time Out_time
151 01/01/2012 07:00:00 am 01/03/2012 03:00:00 pm
151 01/06/2012 03:30:00 pm 01/09/2012 07:00:00 am
167 01/03/2012 01:30:00 pm 01/09/2012 07:00:00 am
167 01/13/2012 03:30:00 pm 01/15/2012 11:30:00 am
167 01/18/2012 12:00:00 pm 01/19/2012 03:00:00 am
I could not get the logic on how to compare and merge rows.
Thanks in Advance, Abhi
General example of subtracting time - copy/paste to see the output. This example will give you differences in hours, minutes, seconds between two dates. The basic formula is (end_date - start_date) * 86400 (number of seconds in 24 hrs)...:
SELECT trunc(mydate / 3600) hr
, trunc(mod(mydate, 3600) / 60) mnt
, trunc(mod(mydate, 3600) / 60 /60) sec
FROM
(
SELECT (to_date('01/03/2012 10:00:00', 'mm/dd/yyyy hh24:mi:ss') -
to_date('01/01/2012 07:00:00', 'mm/dd/yyyy hh24:mi:ss')) * 86400 mydate
FROM dual
)
/
HR | MNT | SEC
---------------
51 | 0 | 0
You need to check your example and logic. I could not understand what needs to be comnpared with what...