2016-11-10 10 views
9

Nếu tôi có ZKTime máy để đăng ký sự tham dự của nhân viên.Cách khôi phục đúng ngày nếu nó được chèn gần đây

Đôi khi máy tính này chèn số lượng lớn các giao dịch trong SQL Server db với ngày sau đó sai như

8-2103 thay vì 11-2016

enter image description here


enter image description here


Nguyên nhân có thể của vấn đề này là gì và cách khôi phục đúng ngày nếu tôi không thể phát hiện sự cố?

+1

Nếu nhập sai ngày, bạn sẽ biết ngày thích hợp như thế nào? – mendosi

+0

@mendosi: tôi không biết tôi thử thông qua thứ tự 'S_T_NO' để đoán ngày gần nhất –

+0

Có vẻ như định dạng ngày giờ sai được sử dụng khi chèn ... Bạn không thể khôi phục dữ liệu đó - đó là dữ liệu bị hỏng. – Narf

Trả lời

4

Tôi đã nhìn vào liên kết nhà cung cấp mà bạn cung cấp và nó không giúp đỡ trong trường hợp này. Tôi e rằng chúng tôi sẽ không thể trả lời điều này do các mục bên ngoài SQL Server. Tôi tin rằng bạn sẽ cần phải liên hệ với bộ phận hỗ trợ của nhà cung cấp cho việc này.

Các câu hỏi mà bạn sẽ cần phải tìm hiểu là:

  1. Làm thế nào để cỗ máy thời gian tính toán dữ liệu CheckTime?
  2. Máy thời gian lưu trữ dữ liệu Kiểm tra thời gian như thế nào?
  3. Máy tạo tệp để xuất sang SQL Server như thế nào?

Điều này có vẻ là vấn đề với cách hệ thống ghi lại dữ liệu CheckTime hoặc cách dữ liệu xuất/ghi dữ liệu vào máy chủ SQL.

Theo cách sửa chữa vấn đề, một câu lệnh cập nhật cơ bản sẽ khắc phục nó, nhưng vì có những ngày khác nhau bạn sẽ cần phải viết một bản cập nhật duy nhất cho từng trường hợp.

0

nếu đó là lỗi tĩnh, bạn có thể

update table set Checktime = DATEADD(YEAR, -97, dateadd(MONTH,-4,checktime)) where checktime > '2017-12-12'

ví dụ

+0

không có lỗi tĩnh –

1

Một giải pháp khả thi là sử dụng Trình kích hoạt để xác thực ngày và cập nhật ngày tương ứng. Giả sử bảng có khóa chính là id, nếu một hàng mới được chèn vào có ngày vượt quá ngày hôm nay, nó có thể được đặt lại về ngày giờ hiện tại vì hồ sơ điểm danh của nhân viên không thể là tương lai.

CREATE TRIGGER CorrectTheDate on Config 
FOR INSERT 
AS 

DECLARE @CT DateTime 
DECLARE @id int 

SELECT @CT = i.CheckTime FROM inserted i; 
SELECT @id= i.id FROM inserted i; 

if(@CT >= DATEADD(dd,1,getdate())) 
UPDATE MyTable SET CheckTime=getdate() WHERE [email protected] 

GO 
+0

Mặc dù ý tưởng là tốt, mã yêu cầu một số chỉnh sửa vì nó giả định trình kích hoạt sẽ kích hoạt một bản ghi cùng một lúc, Ngoài ra, hầu hết các máy này có thể hoạt động ngoại tuyến khi máy chủ không khả dụng do để ngắt kết nối mạng hoặc bảo trì máy chủ ... v.v. trong trường hợp đó, người đọc sẽ gửi các bản ghi đến máy chủ vào các thời điểm khác với thời gian thực tế của người đọc. –

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