시간 데이터 형식에 분을 어떻게 추가합니까?


10

두 개의 레코드를 테이블에 삽입하는 저장 프로 시저가 있는데 레코드의 차이점은 두 번째 레코드의 시간 열 @MinToAdd이 첫 번째 레코드 이후라는 것입니다.

CREATE PROCEDURE CreateEntry
    /*Other columns*/
    @StartTime time(2),
    @EndTime time(2),
    @MinutesToAdd smallint
    AS
BEGIN
    SET NOCOUNT ON;

    SET @MinutesToAdd = @MinutesToAdd % 1440;   --Prevent overflow if needed?
    IF (@MinutesToAdd > 0)
    BEGIN
    INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
        OUTPUT inserted.id
        VALUES
               (/*Other columns*/ @StartTime, @EndTime),
               (/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
    END
    ELSE
    BEGIN
        /*Whatever ELSE does.*/
    END
END

추가 할 수있는 올바른 방법은 무엇입니까 @MinutesToAdd로 분 @StartTime하고는 @EndTime? 데이터 형식을
사용하고 time있습니다.

업데이트 :
정답에는 다음 정보가 포함되어야합니다.

  • time데이터 유형에 분을 추가하는 방법
  • 제안 된 솔루션은 정밀도 손실을 초래하지 않습니다.
  • 분이 너무 커서 time변수 에 맞지 않거나 변수가 롤오버 될 위험이 있는 경우 알아야 할 문제 또는 우려 사항 time입니다. 문제가 없다면, 그렇게하십시오.

5
귀하의 질문에 대한 편집 내용이 해당 질문을 어떻게 더 명확하게하는지 알 수 없습니다.
swasheck

@ swasheck 나는 내가 찾고있는 세 가지를 명시 적으로 언급한다. 나는 또한 내가 찾지 않는 것에 한계를 두었다.
Trisped

답변:


36

새로운 유형에는 게으른 속기 연산을 사용할 수 없습니다. 시험:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

@MinutesToAdd오버플로로부터 보호하더라도 오버플로로부터 결과를 보호하지는 않습니다. 그러나 오류가 발생하지는 않지만 예상 한 결과가 아닐 수도 있습니다.

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

결과:

00:19:00

나는 이것이 어떤 유형의 내부 변환을 거쳐야한다고 가정합니다.

DECLARE @StartTime TIME(0) = '24:19';

결과:

메시지 241, 수준 16, 상태 1, 줄 1
문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다.

당신은 당신이 계산을 처리하는 방법을 고려할 필요가 이어질 그 중 하나 @EndTime또는 둘 모두 @StartTime@EndTime다음 날에합니다.

또한 "이상적인 답변"의 또 다른 새로운 요구 사항을 해결하기 위해 정밀도 손실이 없습니다. 에 따라 문서 의 반환 형식은 DATEADD입력과 동일합니다 :

반환 데이터 형식은 문자열 리터럴을 제외하고 날짜 인수 의 데이터 형식입니다 .

따라서 TIME,에서 TIME밖으로.


1
+1 @Aaron 또는 StartTime 및 TimeToAdd를 datetime으로 변환 한 다음 추가 할 수 있습니다. 분이 59보다 크면 TimeToAdd 변환이 매우 어려워집니다. DATEADD가 가장 좋은 솔루션입니다.
brian

DATEADD날짜 인수와 동일한 유형 을 반환하는 추가 하면 동의합니다. "필요한 경우 오버플로 방지?" 라인이 필요하지 않습니다. 롤오버 문제는 데이터 소스와 데이터 대상에 의해 처리됩니다.
Trisped

3
@ DATEADD가 DATETIME 만 반환 할 수 있다고 생각하여 문제를 일으킬 수 있다고 생각했기 때문에 DATEADD가 적절하지 않다고 생각하는 질문에 추가하면 확실합니다. 그렇지 않으면 그것은 당신의 질문이나 미래 독자들과 관련이없는 것 같습니다 ...
Aaron Bertrand

"시간 데이터 형식을 사용하고 있습니다."에 의해 관련성이 어떻게 암시되지 않습니까? 또한 왜 레코드 대신 행을 항상 사용하도록 내 질문을 변경 했습니까?
Trisped

1
@ 편집은 더 나은 용어를 사용하므로 편집 관련 FAQ 를 참조하십시오. 더 이상 앞뒤로 보지 않으면 질문을 잠글 것입니다. 아론은 우리가 다른 사람들을 위해 모든 것을 명확하게해야한다는 것이 옳습니다. 당신의 대답이 있습니다. 도움이 될 것 같으면 제안한 내용에 따라 질문을 편집 해보십시오. Aaron은 원하는 정보를 답변에 추가하도록 친절하게 제안했습니다.
잭 topanswers.xyz 시도라고

0

dateadd 함수를 사용하여 '0:00'에 대해 정수로 분을 추가하십시오. 그런 다음 시간으로 되돌립니다.

캐스트 (날짜를 dateadd (분, 84, '0 : 00')로 선택)

여기서 84는 "시간"유형으로 표현하려는 정수 분입니다.

나는 그것을 '0:00'에 추가 한 다음 날짜 구성 요소를 제거하기 위해 시간 유형으로 캐스팅합니다. 사용자 정의 코딩이 필요하지 않습니다.

(열 이름 없음)

01 : 24 : 00.0000000

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.