SQL между датами, но отключается в определенное время и продолжается и в определенное время - PullRequest
4 голосов
/ 05 августа 2010

У меня есть запрос MSSQL, который запускает производительность заказа в течение определенного периода времени.В основном он рассчитывает, сколько времени занимает заказ от даты начала до даты завершения в минутах.

То, что я делаю, - это получение даты и метки времени, когда был создан заказ (а) и получение даты и метки времени, когда заказ был выполнен (б) и вычитание их, затем умножение их на 1440, чтобы получитьминут между двумя датами.

,FLOOR(((CAST(b.[AuditInsertTimestamp2] AS FLOAT)) - (CAST(a.[AuditInsertTimestamp2] AS FLOAT))) * 1440) AS [Minutes]

Это прекрасно работает, но также учитывает время, когда наш бизнес закрыт.То, что я хочу сделать, это просто вернуть, сколько времени между этими датами занято, когда наш бизнес открыт (6:30 AM - 5:00 PM).Даты могут охватывать несколько дней или только один день.Есть идеи?!?!?!

Спасибо !!!!

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Вот окончательные запросы, если кто-то хочет знать ....

/****** Object:  UserDefinedFunction [dbo].[udf_TEST]    Script Date: 08/11/2010 16:49:06 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE FUNCTION [dbo].[udf_TEST]  
    (  
        @StartDate DATETIME,  
        @EndDate DATETIME  
    )  
    RETURNS VARCHAR(MAX)  

    --DECLARE @StartDate DATETIME  
    --DECLARE @EndDate DATETIME  
    --SET @StartDate = '2010-07-06 14:46:37.577'   
    --SET @EndDate = '2010-07-09 09:04:31.290'  
    BEGIN  
    DECLARE @FinalMinutes AS DECIMAL  
    IF (CONVERT(VARCHAR(13), @StartDate, 114) < CONVERT(VARCHAR(13), @EndDate, 114))  
    BEGIN  
    DECLARE @NonWorkTime1 INT  
    SET @NonWorkTime1 = 780  
    --How many minutes are between order start and end time including non working time  
    DECLARE @AllMins1 INT   
    --Declares how many minutes are in a day and makes it float to get remainder minutes when divided  
    DECLARE @MinsInDay1 DECIMAL  
    SET @MinsInDay1 = 1440.0  
    --Finds how many minutes are between start and end time excluding weekends and assignes to variable   
    SET @AllMins1 = ((DATEDIFF(mi, @StartDate, @EndDate))   
      -(((DATEDIFF(wk, @StartDate, @EndDate) * 2) * 24) * 60)    
      -(((CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) * 24) * 60)  
      -(((CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) * 24) * 60))   
    --Calculates how many days have elapsed in the minutes that the order has taken  
    DECLARE @MinDays1 INT  
    SET @MinDays1 = (@AllMins1/@MinsInDay1)  
    --Subtracts complete day non worked minutes from final minutes between orders  
    SET @FinalMinutes = (@AllMins1 - (@MinDays1 * @NonWorkTime1) + 360 + 420)  
    END  
    ELSE  
    BEGIN   
    --How many minutes a day are not worked for trips  
    DECLARE @NonWorkTime INT  
    SET @NonWorkTime = 780  
    --How many minutes are between order start and end time including non working time  
    DECLARE @AllMins INT   
    --Declares how many minutes are in a day and makes it float to get remainder minutes when divided  
    DECLARE @MinsInDay DECIMAL  
    SET @MinsInDay = 1440.0  
    --Finds how many minutes are between start and end time excluding weekends and assignes to variable   
    SET @AllMins = ((DATEDIFF(mi, @StartDate, @EndDate))   
      -(((DATEDIFF(wk, @StartDate, @EndDate) * 2) * 24) * 60)    
      -(((CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) * 24) * 60)  
      -(((CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) * 24) * 60))   
    --Calculates how many days have elapsed in the minutes that the order has taken  
    DECLARE @MinDays INT  
    SET @MinDays = (@AllMins/@MinsInDay)  
    --Subtracts complete day non worked minutes from final minutes between orders  
    SET @FinalMinutes = (@AllMins - (@MinDays * @NonWorkTime))  
    END 
    RETURN -(@FinalMinutes) 
    END  

В моем основном запросе у меня есть регистр, который, если между @StartDate и @Enddate меньше суток, он просто вычитает время, в противном случае, если его больше суток или меньше суток, но меньше 24 часов это посылает это к этой функции. Кажется, все работает отлично !!!

1 голос
/ 05 августа 2010

Я бы использовал ваш код для подсчета всех минут между этими двумя датами, но потом вычел бы количество минут, в течение которых ваша компания закрыта.

Для этого используйте эта функция рассчитывает количество рабочих дней (следовательно, исключая выходные дни) и умножает вывод на 630 (10 с половиной часов * 60 = количество минут в день, в течение которых ваш бизнес открыт).

Сложив все это, это будет примерно так:

(your result) - (number of work days between the beginning and the end of the request) * 630

Хотя праздничные дни не будут учитываться.Приветствия!

РЕДАКТИРОВАТЬ : поскольку эта ссылка требует регистрации, вот краткая версия самого кода;проверьте исходный источник для деталей, поскольку я не являюсь автором этого:

SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
0 голосов
/ 05 августа 2010

В самом простом случае просто посчитайте количество дней и умножьте на 630 минут (10,5 часов работы вашего предприятия каждый день).

Если ваше решение должно быть более сложным, чем это (исключаяв выходные, праздничные дни и т. д.), я бы сказал, что лучше использовать логику вне базы данных и на бизнес-уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...