Nối tiếp dãy số theo thời gian

Liên hệ QC

echo07

Nguyệt Hà
Tham gia
24/8/07
Bài viết
422
Được thích
316
Chào các anh chị.

Tôi có một dãy số được xuất tự động từ một thiết bị gồm có ngày tháng và giờ, cứ mỗi một ô lại tăng thêm một phút. Yêu cầu là nối tiếp dãy dữ liệu này theo điều kiện như vậy mà mãi chưa làm được, mong cả nhà giúp đỡ.

1672471119310.png
 

File đính kèm

  • Cong thoi gian.xlsx
    8.3 KB · Đọc: 11
Chào các anh chị.

Tôi có một dãy số được xuất tự động từ một thiết bị gồm có ngày tháng và giờ, cứ mỗi một ô lại tăng thêm một phút. Yêu cầu là nối tiếp dãy dữ liệu này theo điều kiện như vậy mà mãi chưa làm được, mong cả nhà giúp đỡ.

View attachment 285289
thử hàm thô thiển này thử bạn:

PHP:
Function AddOneMinute(time As String) As String
  Dim timeComponents() As String
  Dim day As Long
  Dim month As Long
  Dim year As Long
  Dim hour As Long
  Dim minute As Long
  Dim second As Long
 
  ' Replace spaces and colons with hyphens
  time = Replace(time, " ", "-")
  time = Replace(time, ":", "-")
 
  ' Split the input string into its individual components
  timeComponents = Split(time, "-")
  day = Val(timeComponents(0))
  month = Val(timeComponents(1))
  year = Val(timeComponents(2))
  hour = Val(timeComponents(3))
  minute = Val(timeComponents(4))
  second = Val(timeComponents(5))
 
  ' Create a date using the individual components
  Dim dt As Date
  dt = DateSerial(year, month, day) + TimeSerial(hour, minute, second)
 
  ' Add 1 minute to the date
  dt = DateAdd("n", 1, dt)
 
  ' Return the updated date as a string in the desired format
  AddOneMinute = Format(dt, "dd-mm-yy hh:mm:ss")
End Function
 
Bạn tham khảo:
=DATEVALUE("11-12-22 19:08:58") + TIMEVALUE("11-12-22 19:08:58") + 1/24/60
 
Chỉ cần cộng 1/1440 như bài 2.
 
Chỉ cần cộng 1/1440 như bài 2.
Như vậy hỏng có vẻ "nguy hiểm".
Chơi vầy cho nó đã:
- đặt một name NGAYGIOGOC = 28/12/2022 19:00:58
- công thức =NGAYGIOGOC + (ROW() - ROW(gốc))/1440

Chú: con toán chia thì có sai số. Tùy theo loại sai số mà ta chọn kiểu tính từng ô riêng hay tính lũy tiến như bài #2.
Tuy nhiên, bài này sai số rất nhỏ cho nên không thành vấn đề.
Ở trên tôi chỉ minh họa.
 
Anh @VetMini là người đầu tiên khai bút của diễn đàn GPE
Chúc Anh có thật nhiều sức khỏe, hạnh phúc và có nhiều cống hiến cho Diễn đàn GPE.
 
Thật ra với số chia 1/1440 hay 1/24/60 nếu có sai biệt (hoặc sai biệt từng lần khác với sai biệt lũy kế), nó sẽ rất nhỏ. thì khi Excel tính toán để hiển thị lên dạng date time là đã tự làm tròn đến hàng tròn giây rồi.
 
Thì chính anh nói "bài này sai số rất nhỏ cho nên không thành vấn đề"
Ừ nhỉ. Thói quen [xấu] của gần 40 năm làm việc với lập trình. Cứ thấy con toán chia là nghĩ đến 0 và sai số.

Chú cho các bạn không có thói quen làm việc với số thực:
Không hẳn chỉ chia 0 mới bị lỗi. Một số thực tương đối lớn, chia cho một số thực tương đối nhỏ cũng có thể sinh ra lỗi tràn số.

Thật ra với số chia 1/1440 hay 1/24/60 nếu có sai biệt (hoặc sai biệt từng lần khác với sai biệt lũy kế), nó sẽ rất nhỏ. thì khi Excel tính toán để hiểu thị lên dạng date time là đã tự làm tròn đến hàng tròn giây rồi.
Sai số tôi muốn nói là chỗ đó. Cộng lúy tiến mọt hồi có thể xảy ra 58 giây thành 59.
Tuy nhiên, tôi đã thử 200000 lần cộng mà không thấy suy xuyển cho nên mới kết luận là sai số rất nhỏ.
 
Tuy nhiên, tôi đã thử 200000 lần cộng mà không thấy suy xuyển cho nên mới kết luận là sai số rất nhỏ.
Tôi chỉ đoán mà không thử. Một giây có giá trị là 1/86,400. Sai số của 1/1440 sẽ ít nhất là 1/ 1 tỷ (9 số 0) hoặc nhỏ hơn nữa (15, 20 số 0). Vậy thì phải bằng nào đó dòng lũy kế mới đạt 1/86,400
 
Tôi chỉ đoán mà không thử. Một giây có giá trị là 1/86,400. Sai số của 1/1440 sẽ ít nhất là 1/ 1 tỷ (9 số 0) hoặc nhỏ hơn nữa (15, 20 số 0). Vậy thì phải bằng nào đó dòng lũy kế mới đạt 1/86,400
Sẵn có dịp nói chuyện sai số, tiếp cho vui.

Sai số của máy tính là chữ số thứ 15.
Ngày trong Excel chiếm 5 chữ số đầu. 10 chữ số còn lại để cho giờ phit giây và tíc tắc (ticks).
Excel sẽ cố làm tròn ở đó. Tức sai số ở hàng 10 tỷ, tức 1/(1E-10). Tôi chưa tìm được tài liệu về thuật toán làm tròn của Excel.
 
Cảm ơn bác, chúc bác và gia đình năm mới vạn sự bình an
Bài đã được tự động gộp:

thử hàm thô thiển này thử bạn:

PHP:
Function AddOneMinute(time As String) As String
  Dim timeComponents() As String
  Dim day As Long
  Dim month As Long
  Dim year As Long
  Dim hour As Long
  Dim minute As Long
  Dim second As Long
 
  ' Replace spaces and colons with hyphens
  time = Replace(time, " ", "-")
  time = Replace(time, ":", "-")
 
  ' Split the input string into its individual components
  timeComponents = Split(time, "-")
  day = Val(timeComponents(0))
  month = Val(timeComponents(1))
  year = Val(timeComponents(2))
  hour = Val(timeComponents(3))
  minute = Val(timeComponents(4))
  second = Val(timeComponents(5))
 
  ' Create a date using the individual components
  Dim dt As Date
  dt = DateSerial(year, month, day) + TimeSerial(hour, minute, second)
 
  ' Add 1 minute to the date
  dt = DateAdd("n", 1, dt)
 
  ' Return the updated date as a string in the desired format
  AddOneMinute = Format(dt, "dd-mm-yy hh:mm:ss")
End Function
Cảm ơn bạn nhé
Bài đã được tự động gộp:

Như vậy hỏng có vẻ "nguy hiểm".
Chơi vầy cho nó đã:
- đặt một name NGAYGIOGOC = 28/12/2022 19:00:58
- công thức =NGAYGIOGOC + (ROW() - ROW(gốc))/1440

Chú: con toán chia thì có sai số. Tùy theo loại sai số mà ta chọn kiểu tính từng ô riêng hay tính lũy tiến như bài #2.
Tuy nhiên, bài này sai số rất nhỏ cho nên không thành vấn đề.
Ở trên tôi chỉ minh họa.
Cảm ơn anh nhé.
 
Web KT
Back
Top Bottom