所以我试图解决如何检查所选时间是否免费的问题。例如,我在数据库中有记录:
date_from: 2017-06-05
date_till: 2017-07-05
Time_showed: 17:00 - 17:05
时间显示表示视频在17:00开始播放,在17:05结束。 所以现在新订单即将到来:
date_from: 2017-06-12
date_till: 2017-09-05
Time_showed: 17:02 - 17:06
因此我们看到17:02到17:06之间的时间(17:03-17:05)。任何想法如何用sql和php检查它,以便在这种情况下它会返回错误“时间被采取”?
是的stackoverflow并不是我要问的第一个地方。在此之前,我试图谷歌很多,并自己解决...似乎我没有足够强硬解决它,哈哈。
答案 0 :(得分:0)
好的,我可以理解为什么你需要这样设计的数据,但是值得你花时间看看它是否可以设计得不同。 但是,你来寻求帮助,这就是我们所有人应该做的而不是做出判断。我们都在研究那些没有以最佳方式设计的DB,并且无论出于何种原因都不得不忍受它。 (走开我的肥皂盒......)
所以我认为你可能想把它作为你在日期和节目时间传递的存储过程并返回一个真假。 您需要检查的条件是: 这是在现有保留日期期间和 - 假设此期间可以为空 这是在现有的保留时间内。 - 将假设必须输入。如果整天都有00:00 - 24:59的时间
我提出了以下脚本:
IF EXISTS (SELECT * FROM sys.tables where tables.name like '#myTable%')
begin
drop table #myTable
end;
CREATE TABLE #myTable
(
date_from date NULL,
date_till date NULL,
Time_showed varchar(20)
);
INSERT INTO #myTable
VALUES
('2017-06-05', '2017-07-05', '17:00 - 17:05'),
('2017-06-05', '2017-06-05', '08:00 - 08:05');
--test data
DECLARE
@test_from date,
@test_till as date,
@test_time_showed as varchar(20);
--SELECT
-- @test_from = '2017-06-12',
-- @test_till = '2017-07-05',
-- @test_time_showed = '17:02 - 17:06';--1
SELECT
@test_from = '2017-06-05',
@test_till = '2017-06-05',
@test_time_showed = '08:00 - 08:00';--0
--SELECT
-- @test_from = '2017-06-05',
-- @test_till = '2017-06-05',
-- @test_time_showed = '07:59 - 08:00';--0
--SELECT
-- @test_from = '2017-06-12',
-- @test_till = '2017-07-05',
-- @test_time_showed = '17:07 - 17:16';--0
--SPLIT
DECLARE @start_time time = CONVERT(TIME,RTRIM(SUBSTRING(@test_time_showed,0,CHARINDEX('-',@test_time_showed))));--you should turn this into a function (GetStartTime)
DECLARE @end_time time = CONVERT(TIME,LTRIM(SUBSTRING(@test_time_showed,CHARINDEX('-',@test_time_showed) + 1,len(@test_time_showed))));--you should turn this into a function (GetEndTime)
----checking values CAN BE DELETED
--SELECT @start_time,@end_time;
--SELECT date_from, date_till,
-- CONVERT(TIME,RTRIM(SUBSTRING(Time_showed,0,CHARINDEX('-',Time_showed)))) AS START_T,
-- CONVERT(TIME,LTRIM(SUBSTRING(Time_showed,CHARINDEX('-',Time_showed) + 1,len(Time_showed)))) AS END_T
--FROM #MYTABLE
--VALIDATION
--TODO: You need to add some validation to insure that you are getting the correct data.
--CHECK
-- IS
SELECT CASE
WHEN EXISTS ( SELECT date_from
FROM #myTable
WHERE
--check if any records on file is for any date in span
((date_from BETWEEN @test_from AND @test_till) OR
(date_till BETWEEN @test_from AND @test_till) ) AND
--if a record is for any date in span, check if times overlap (THE NASTY STUFF)
(
@start_time > CONVERT(TIME,RTRIM(SUBSTRING(Time_showed,0,CHARINDEX('-',Time_showed))))--you should turn this into a function (GetStartTime)
AND
@start_time < CONVERT(TIME,LTRIM(SUBSTRING(Time_showed,CHARINDEX('-',Time_showed) + 1,len(Time_showed))))--you should turn this into a function (GetEndTime)
) OR
(
@end_time > CONVERT(TIME,RTRIM(SUBSTRING(Time_showed,0,CHARINDEX('-',Time_showed))))--you should turn this into a function (GetStartTime)
AND
@end_time < CONVERT(TIME,LTRIM(SUBSTRING(Time_showed,CHARINDEX('-',Time_showed) + 1,len(Time_showed))))--you should turn this into a function (GetEndTime)
)
)
THEN 1 --TIME PERIOD ALREADY USED
ELSE 0 --TIME PERIOD NOT USED
END;
注意:这只是一个启动脚本,并且我认为您需要添加一些其他功能。 此外,您可能希望将其转换为存储过程,如前所述,并创建两个辅助函数来处理拆分和转换为时间,因为我可以看到您将需要其他位置。 我没有在两者之间使用,因为正如你所说,实际花费的时间是在&#39; time_showed&#39;之间。 (... 17:02到17:06之间的时间(17:03-17:05)...)。 &#39; BETWEEN&#39;将匹配到&#39; 08:00 - 08:05&#39;和&#39; 08:05 - 09:45&#39;。