2011-08-09 45 views
9

Tôi đã nhìn chằm chằm vào điều này trong một thời gian và không thể tìm ra cách để thực hiện nó. Tôi không thực sự có bất kỳ mã nào để đăng bài vì tôi thậm chí còn chưa nhận ra nó và mọi thứ tôi nghĩ ra không có ý nghĩa gì cả.Cập nhật TSQL phút và giây DATETIME

Dù sao, chúng tôi có một ứng dụng thu thập dữ liệu 5 phút một lần dựa trên giá trị tối đa (thời gian đọc) trong bảng (nhưng cũng sẽ chỉ hiển thị giá trị thực nếu thời gian là bội số của 5 và là: 00.000 giây). Đối với hầu hết các phần, điều này là tốt, nhưng đôi khi dữ liệu sẽ được ra khỏi đồng bộ và gây ra một loạt các giá trị 0 trong bảng của chúng tôi.

Hiện tại, chúng tôi vừa tham gia, lấy thời gian đọc mới nhất và mã hóa ngày mới mà chúng tôi muốn sử dụng. Tôi đang tìm một kịch bản mà tôi có thể sử dụng để tự động hóa điều này. Với mục đích của câu hỏi này, chúng ta có thể sử dụng GETDATE().

DECLARE @readtime DATETIME = GETDATE() --2011-08-09 08:51:19.237 
      -- I want it to look like 2011-08-09 08:50:00.000 

Trả lời

3

Làm tròn xuống 5 phút gần nhất.

DECLARE @readtime DATETIME = 
    DATEADD(minute, 5*FLOOR(DATEDIFF(minute, 0, GETDATE())/5.0), 0) 
+0

5 * Tầng/5.0 hoạt động trong trường hợp này là gì? – Dibstar

+0

@Davin - Phút được chia cho 5.0 để có được giá trị nổi được làm tròn xuống số nguyên gần nhất bằng cách sử dụng 'tầng'. Giá trị đó được nhân với 5 để quay lại số phút một lần nữa. –

+0

cảm ơn vì điều đó, những thứ gọn gàng! – Dibstar

0

Bạn có thấy điều này không?

How to Round a Time in T-SQL

Bạn có thể thử các RoundTime chức năng từ câu trả lời được chấp nhận ở đó.

4

Hãy thử điều này.

Nó cơ bản kiểm tra phút để chia hết cho 5, giây bằng 6 và ms 1000, và nếu họ không phải là nó trừ thời gian còn lại từ mỗi:

DECLARE @dt datetime = '2011-08-09 08:51:19.237' 

SELECT DATEADD(
       MILLISECOND, 
       -(DATEPART(MILLISECOND, @dt) % 1000), 
       DATEADD(
         SECOND, 
         -(DATEPART(second, @dt) % 60), 
         DATEADD(
           minute, 
           -(DATEPART(minute, @dt) % 5), @dt) 
         ) 
       ) 

Output:

2011-08-09 08:50:00.000

+0

+1 Cuộc sống có thể đơn giản như vậy –

+0

@Lieven - không phải lúc nào cũng vậy, nhưng thật tuyệt khi có. – JNK

+0

Cảm ơn bạn đã trả lời nhanh. Tôi không chắc chắn nếu anh chàng đã xóa nó hoặc nếu tôi chỉ không thể tìm thấy nó, nhưng điều này cũng làm việc. DECLARE @readtime DATETIME = DATEADD (phút, 5 * ROUND (DATEDIFF (phút, 0, GETDATE())/5, 0), 0) – Tom

Các vấn đề liên quan