Author |
Topic |
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 13:11:12
|
This query is returning a NULL:SELECT 'Banquets - All Day' as revName, SUM(t.c_items_total) AS Banquet_Total, SUM(t.cover_count) as Total_Covers, SUM(t.c_items_total) / SUM(t.cover_count) as AvgPer_Cover FROM dbo.Ticket AS t JOIN dbo.PeriodDefinition AS pd ON CAST(t.dt_close_time AS time) BETWEEN CAST(pd.dt_start AS time) AND CAST(pd.dt_finish AS time) AND pd.i_period_definition_id = 4 and t.i_revcenter_id = 7 and t.i_void_ticket_id IS NULL and t.b_closed = 1There are 4 dayParts in the software:Lunch, i_period_definition_id = 1 '1899-12-30 10:00:00.000' to'1899-12-30 15:00:00.000'Dinner, i_period_definition_id = 2 '1899-12-30 15:00:00.000' to'1899-12-30 22:00:00.000'Breakfast, i_period_definition_id = 3 '1899-12-30 04:00:00.000' to'1899-12-30 10:00:00.000'LateNight, i_period_definition_id = 4 '1899-12-30 22:00:00.000' to'1899-12-30 04:00:00.000'The reason is (the why) the i_period_definition_id = 4 is from '1899-12-30 22:00:00.000' to '1899-12-30 04:00:00.000' - this returns Ticket totals for the time range, this is Point of Sale software. So from 10pm to the following day at 4am. I just lack the syntax to make this why, I know why it doesn't work...but lack the language to fix.A 24 day in this software is from 4am to 4am..but as we know our clock is from 12am to 12am...so query retuns a NULL due to the fact the period_definition is from 10pm to 4am. If I change '1899-12-30 04:00:00.000' TO '1899-12-30 23:59:59.000', the query returns the totals, but they close Tickets after Midnight.Can someone help?Thanks. |
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 13:35:49
|
You didn't mention if your time fields are just times or datetimes. I assumed the latter. SELECT'Banquets - All Day' as revName,SUM(t.c_items_total) AS Banquet_Total,SUM(t.cover_count) as Total_Covers,SUM(t.c_items_total) / SUM(t.cover_count) as AvgPer_CoverFROM dbo.Ticket AS t CROSS JOIN dbo.PeriodDefinition AS pd WHERE t.dt_close_time >= pd.dt_start and t.dt_close_time <= pd.dt_finish AND pd.i_period_definition_id = 4 AND t.i_revcenter_id = 7 AND t.i_void_ticket_id IS NULL AND t.b_closed = 1 |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 13:44:19
|
quote: Originally posted by gbritton You didn't mention if your time fields are just times or datetimes. I assumed the latter. SELECT'Banquets - All Day' as revName,SUM(t.c_items_total) AS Banquet_Total,SUM(t.cover_count) as Total_Covers,SUM(t.c_items_total) / SUM(t.cover_count) as AvgPer_CoverFROM dbo.Ticket AS t CROSS JOIN dbo.PeriodDefinition AS pd WHERE t.dt_close_time >= pd.dt_start and t.dt_close_time <= pd.dt_finish AND pd.i_period_definition_id = 4 AND t.i_revcenter_id = 7 AND t.i_void_ticket_id IS NULL AND t.b_closed = 1
Thank you for the response...Yes, DATETIME, my apology.The WHERE clause wont work due to WHERE %PARAMS% - where Params is the time and date range selected by the User in the UI of the software.So only SELECT and FROM clauses can be used.Thank you.EDIT: I am still getting a NULL with the above Query, as-is. |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 13:48:57
|
Hmmm... not good practice. So keep the last bit asFROM dbo.Ticket AS t JOIN dbo.PeriodDefinition AS pd ON t.dt_close_time >= pd.dt_start and t.dt_close_time <= pd.dt_finish AND pd.i_period_definition_id = 4 AND t.i_revcenter_id = 7 AND t.i_void_ticket_id IS NULL AND t.b_closed = 1 |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 14:16:04
|
quote: Originally posted by gbritton Hmmm... not good practice. So keep the last bit asFROM dbo.Ticket AS t JOIN dbo.PeriodDefinition AS pd ON t.dt_close_time >= pd.dt_start and t.dt_close_time <= pd.dt_finish AND pd.i_period_definition_id = 4 AND t.i_revcenter_id = 7 AND t.i_void_ticket_id IS NULL AND t.b_closed = 1
Yea, still getting a NULL.The fact that the DATE changes at midnight is the issue....so there needs to be a DATEADD + 1 somehow/where? |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 14:24:12
|
Tell me. are pd.dt_start an pd.dt_finish datetime types or just time values? If they have the dates, you should be fine. Post a few samples if you can. |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 14:34:09
|
quote: Originally posted by gbritton Tell me. are pd.dt_start an pd.dt_finish datetime types or just time values? If they have the dates, you should be fine. Post a few samples if you can.
DateTime Types, if I am correct in saying that...i_period_definition_id, s_name, dt_start, dt_finish 1, Lunch, 1899-12-30 10:00:00.000, 1899-12-30 15:00:00.000 |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 14:38:56
|
so, a ticket with a given close time must fall between those times,right? If a 24-hour period begins a 4 am, a typical one might be 2015-03-11 04:00:00.000 2015-03-12 03:59:59:999correct?so, a ticket closed at, say 12:30 on the 12th would fall into this interval, right? |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 14:52:42
|
quote: Originally posted by gbritton so, a ticket with a given close time must fall between those times,right? If a 24-hour period begins a 4 am, a typical one might be 2015-03-11 04:00:00.000 2015-03-12 03:59:59:999correct?so, a ticket closed at, say 12:30 on the 12th would fall into this interval, right?
No, the time is from 04:00:00.000 to 04:00:00.000AS you see below, there are no gaps...where one ends, the other begins. So a ticket close time can be, for example: 2014-05-01 21:59:01.097There are 4 dayParts in the software:Lunch, i_period_definition_id = 1 '1899-12-30 10:00:00.000' to'1899-12-30 15:00:00.000'Dinner, i_period_definition_id = 2 '1899-12-30 15:00:00.000' to'1899-12-30 22:00:00.000'Breakfast, i_period_definition_id = 3 '1899-12-30 04:00:00.000' to'1899-12-30 10:00:00.000'LateNight, i_period_definition_id = 4 '1899-12-30 22:00:00.000' to'1899-12-30 04:00:00.000' |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 15:42:28
|
Why does period 4 start at 10 p.m. and end at 4 a.m. on the same day? shouldn't the end date be the next day?Also, Change the join predicate to:ON t.dt_close_time >= pd.dt_start and t.dt_close_time < pd.dt_finish -- strictly less thanAND ... |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 17:01:41
|
quote: Originally posted by gbritton Why does period 4 start at 10 p.m. and end at 4 a.m. on the same day? shouldn't the end date be the next day?Also, Change the join predicate to:ON t.dt_close_time >= pd.dt_start and t.dt_close_time < pd.dt_finish -- strictly less thanAND ...
"A 24 day in the Point of Sale software is from 4am to 4am [why? because bars and restaurants are open past midnight and the 'business day' is from 4am to 4am]..but as we know our clock is from 12am to 12am...so query retuns a NULL due to the fact the period_definition is from 10pm to 4am. If I change '1899-12-30 04:00:00.000' TO '1899-12-30 23:59:59.000', the query returns the totals, but they close Tickets after Midnight." |
|
|
ScottPletcher
Aged Yak Warrior
550 Posts |
Posted - 2015-03-11 : 17:46:20
|
[code]SELECT 'Banquets - All Day' as revName, SUM(t.c_items_total) AS Banquet_Total, SUM(t.cover_count) as Total_Covers, SUM(t.c_items_total) / SUM(t.cover_count) as AvgPer_CoverFROM dbo.Ticket AS t JOIN dbo.PeriodDefinition AS pd ON CAST(t.dt_close_time AS time) BETWEEN CAST(pd.dt_start AS time) AND CASE WHEN CAST(pd.dt_start AS time) > CAST(pd.dt_finish AS time) THEN '23:59:59.997' ELSE CAST(pd.dt_finish AS time) END AND (CAST(pd.dt_start AS time) < CAST(pd.dt_finish AS time) OR CAST(t.dt_close_time AS time) <= CAST(pd.dt_finish AS time)) AND pd.i_period_definition_id = 4 and t.i_revcenter_id = 7 and t.i_void_ticket_id IS NULL and t.b_closed = 1[/code] |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 18:06:02
|
Still NULL.Thanks for the response Scott. |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-11 : 19:09:37
|
Your period table is messed up. I asked:"Why does period 4 start at 10 p.m. and end at 4 a.m. on the same day? shouldn't the end date be the next day?"You reiterated that the workday is 4am to 4am but didn't answer my question.Earlier you posted this example:LateNight, i_period_definition_id = 4 '1899-12-30 22:00:00.000' to'1899-12-30 04:00:00.000'but the end datetime is before the start datetime, since it is the same day. That just can't be correctbut the dt_finish |
|
|
chef423
Starting Member
15 Posts |
Posted - 2015-03-11 : 19:26:19
|
quote: Originally posted by gbritton Your period table is messed up. I asked:"Why does period 4 start at 10 p.m. and end at 4 a.m. on the same day? shouldn't the end date be the next day?"You reiterated that the workday is 4am to 4am but didn't answer my question.Earlier you posted this example:LateNight, i_period_definition_id = 4 '1899-12-30 22:00:00.000' to'1899-12-30 04:00:00.000'but the end datetime is before the start datetime, since it is the same day. That just can't be correctbut the dt_finish
Can I dropbox share the DB? Its all test data...Just a .bak file, SQL 2008 R2 |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2015-03-12 : 08:35:30
|
Just post a few rows of your input tables and the results you want to see -- using those rows as input. |
|
|
ScottPletcher
Aged Yak Warrior
550 Posts |
Posted - 2015-03-12 : 15:31:40
|
With no test data, I can't test it myself, so good luck from here. |
|
|
|