Làm cách nào để thêm phút vào loại dữ liệu thời gian?


10

Tôi có một thủ tục được lưu trữ để chèn hai bản ghi vào một bảng, sự khác biệt giữa các bản ghi là cột thời gian của bản ghi thứ hai là @MinToAddsau bản đầu tiên:

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

Cách chính xác để thêm @MinutesToAddphút @StartTimevà là @EndTimegì?
Xin lưu ý tôi đang sử dụng timekiểu dữ liệu.

Cập nhật :
Một câu trả lời đúng phải chứa thông tin sau:

  • Làm thế nào để thêm phút vào một timekiểu dữ liệu.
  • Rằng giải pháp đề xuất không dẫn đến mất độ chính xác.
  • Các vấn đề hoặc mối quan tâm cần lưu ý trong trường hợp số phút sẽ quá lớn để phù hợp với một timebiến hoặc có nguy cơ làm timethay đổi biến. Nếu không có vấn đề thì xin vui lòng nêu rõ như vậy.

5
Tôi không thấy cách chỉnh sửa câu hỏi của bạn làm rõ hơn câu hỏi trong tầm tay.
swasheck

@swasheck Tôi nói rõ ràng ba điều tôi đang tìm kiếm. Tôi cũng đặt ra giới hạn về những gì tôi không tìm kiếm.
Đã xem

Câu trả lời:


36

Bạn không thể sử dụng số học tốc ký lười biếng với các loại mới. Thử:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

Lưu ý rằng mặc dù bạn đã bảo vệ bạn @MinutesToAddkhỏi tràn, bạn vẫn không bảo vệ kết quả khỏi tràn. Điều này không mang lại một lỗi, tuy nhiên, có thể không phải là kết quả mà bạn mong đợi.

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

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

Kết quả:

00:19:00

Tôi cho rằng điều này phải trải qua một số loại chuyển đổi nội bộ, bởi vì bạn không thể có được kết quả đó bằng cách nói:

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

Kết quả:

Msg 241, Cấp 16, Trạng thái 1,
Chuyển đổi dòng 1 không thành công khi chuyển đổi ngày và / hoặc thời gian từ chuỗi ký tự.

Bạn cần xem xét cách bạn muốn xử lý các tính toán dẫn đến một @EndTimehoặc cả hai @StartTime@EndTimevào ngày hôm sau.

Ngoài ra - để giải quyết một yêu cầu mới khác trong "câu trả lời lý tưởng" của bạn - không mất đi độ chính xác. Theo tài liệu , loại trả về DATEADDgiống như đầu vào:

Kiểu dữ liệu trả về là kiểu dữ liệu của đối số ngày , ngoại trừ chuỗi ký tự.

Do đó, TIMEtrong, TIMEngoài.


1
+1 @Aaron Ngoài ra, bạn có thể chuyển đổi StartTime và TimeToAdd thành datetime và sau đó thêm. Chuyển đổi TimeToAdd sẽ rất lộn xộn khi số phút> 59. DATEADD là giải pháp tốt nhất.
brian

Nếu bạn thêm DATEADDtrả về cùng loại với đối số ngày thì tôi sẽ chấp nhận. "Ngăn chặn tràn nếu cần?" dòng là không cần thiết. Vấn đề cuộn qua sẽ được xử lý bởi nguồn dữ liệu và đích của dữ liệu.
Đã xem

3
@Trisped chắc chắn, nếu bạn thêm vào câu hỏi mà bạn không nghĩ DATEADD là phù hợp bởi vì bạn nghĩ rằng nó chỉ có thể trả về DATETIME và điều đó có thể gây ra vấn đề. Mặt khác, nó dường như không liên quan đến câu hỏi của bạn hoặc cho những độc giả tương lai ...
Aaron Bertrand

Làm thế nào là mức độ liên quan không được ngụ ý bởi "Xin lưu ý rằng tôi đang sử dụng loại dữ liệu thời gian."? Ngoài ra, tại sao bạn thay đổi câu hỏi của tôi thành hàng sử dụng không thường xuyên thay vì ghi?
Đã xem

1
@Trisped bản chỉnh sửa sử dụng thuật ngữ tốt hơn và vui lòng xem faq khi chỉnh sửa các tập tin nhỏ không có bất kỳ trở lại nào nữa hoặc tôi sẽ khóa câu hỏi. Aaron nói đúng rằng chúng ta cần làm mọi thứ rõ ràng cho người khác, bạn có câu trả lời của bạn. Vui lòng xem xét việc chỉnh sửa câu hỏi của bạn dọc theo dòng mà anh ấy gợi ý nếu bạn nghĩ nó sẽ hữu ích: Aaron đã đề nghị thêm thông tin bạn muốn vào câu trả lời của anh ấy nếu bạn làm như vậy.
Jack nói hãy thử topanswers.xyz

0

Chỉ cần sử dụng hàm dateadd để thêm số phút của bạn vào số nguyên so với '0:00'. Sau đó quay trở lại thời gian.

Chọn diễn viên (dateadd (phút, 84, '0: 00') làm thời gian)

Ở đây, 84 là số nguyên phút tôi muốn được thể hiện theo kiểu "thời gian".

Tôi đã thêm nó vào '0:00' và sau đó để xóa thành phần ngày, tôi chuyển nó thành loại thời gian. Không có mã hóa tùy chỉnh cần thiết.

(Không có tên cột)

01: 24: 00.00000000

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.