在tsql中检查从一天到另一天的小时数

在tsql中检查从一天到另一天的小时数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表,其中有列存储服务的开始时间和结束时间。我没有日期和时间,只有一周中的某一天。考虑到服务从星期一开始到星期二结束,我必须检查一周是否有时间。有人能帮我吗 CREATE TABLE #Calendar ( Name VARCHAR(100), DayWeek INT, HourStart TIME, HourEnd TIME ); INSERT INTO #Calendar (Name, DayWeek, HourStart, HourEnd)

我有一个表,其中有列存储服务的开始时间和结束时间。我没有日期和时间,只有一周中的某一天。考虑到服务从星期一开始到星期二结束,我必须检查一周是否有时间。有人能帮我吗

CREATE TABLE #Calendar (
    Name VARCHAR(100),
    DayWeek INT,
    HourStart TIME,
    HourEnd TIME
);

INSERT INTO #Calendar (Name, DayWeek, HourStart, HourEnd)
    VALUES ('Make a Cake', 1, '19:00:00', '07:00:00');

INSERT INTO #Calendar (Name, DayWeek, HourStart, HourEnd)
    VALUES ('Make a cookie', 1, '07:00:00', '19:00:00');

INSERT INTO #Calendar (Name, DayWeek, HourStart, HourEnd)
    VALUES ('Make a cookie', 2, '19:00:00', '23:00:00');

好的,这一定行。它显示了每一条有时间冲突的线;如果取消注释最后一行,它也将显示没有冲突的行

declare @test_DateTimeStart datetime=dateadd(day,4,'20:00:00') -- Check from Monday 20:00
declare @test_DateTimeEnd datetime=dateadd(day,5,'20:00:00') -- Check to Tuesday 20:00

select q2.result,c.*
from 
    #Calendar c
    cross apply 
    (   select 
        dateadd(day,DayWeek,convert(datetime,HourStart)) as DateTimeStart,
        dateadd(day,DayWeek+1,convert(datetime,HourEnd)) as DateTimeEnd
    )q
    cross apply (select
        case when exists
        (
            select 1 from #Calendar c2 where 
                (@test_DateTimeStart>DateTimeStart and @test_DateTimeStart<DateTimeEnd)
                or
                (@test_DateTimeEnd  >DateTimeStart and @test_DateTimeEnd  <DateTimeEnd)
        )
        then 'Time is taken due to this row -->'
        else 'Time is free due to this row -->'
        end as result
    )q2
--where result='Time is taken due to this row -->'

使用下面的代码实时获取一周中的当前日期。然后与保存的数据进行比较

var myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.google.com");

var response = myHttpWebRequest.GetResponse();

string todaysDates = response.Headers["date"];

return  DateTime.ParseExact(todaysDates,"ddd, dd MMM yyyy HH:mm:ss'GMT'",CultureInfo.InvariantCulture.DateTimeFormat,DateTimeStyles.AssumeUniversal).DayOfWeek;

这将解决它。它将无法使用索引,因为它在比较时对列使用计算:

DECLARE @from time = '22:59', @to time = '23:01'

DECLARE @DayWeek int = 2

;WITH CTE as
(
SELECT 
  dateadd(d, @DayWeek, cast(@from as datetime)) startdate,
  dateadd(d, 
    CASE WHEN @to < @from 
         THEN @DayWeek + 1
         ELSE @DayWeek
    END,
  cast(@to as datetime)) enddate
)
SELECT CASE WHEN 
not exists
(
  SELECT * 
  FROM #Calendar c 
  WHERE cte.startdate < dateadd(d, CASE WHEN HourEnd < HourStart 
  THEN DayWeek + 1 ELSE DayWeek END, cast(HourEnd as datetime))
  AND cte.enddate > dateadd(d, DayWeek, cast(HourEnd as datetime))
) THEN 'Available' ELSE 'Not available' END
FROM CTE

考虑到服务从周一开始,周二结束,你能澄清一下我必须检查一周是否有时间吗?举个例子吧?第一天的星期一在第二天的星期二从晚上7:00到早上7:00已经被占用了。我必须做一个选择来检查我是否可以在20:00到22:00之间插入一条新行,我无法输入这条新行,因为那段时间很忙。我试着在两者之间使用,但我不能。你能理解吗?你真正的意思是HourStart转到DayWeek,而HourEnd转到DayWeek+1。你想检查你是否可以输入一行没有小时重叠的新行,对吗?是的,我需要检查它是HH:MM:SS格式吗?那么,为什么星期二和星期一之间的差值是100呢?我只是在字符串前面加上天数。因为他使用了0填充,所以顺序是正确的。我无法使其正常工作,我认为这一行不兼容:将nvarchar max,Dayweek+HourStart转换为DateTimeStart,因为我的列是TIME类型。nvarchar max和hour数据类型在add运算符中不兼容。哦,Dayweek,HourStart,霍伦德?我以为它们是textDayWeek INT、HourStart TIME和hourrend TIME我只使用sql,无法访问sql Web服务:谢谢!工作完美