2010-10-18 30 views
26

Càng tò mò hơn bất kỳ vấn đề thực sự nào; các câu hỏi đã đưa ra ngày hôm nay và tôi biết tôi đã thấy 1899-12-30 được sử dụng như là một ngày "mặc định" và một ngày không trong Access và các ứng dụng SQL Server cũ hơn. Chỉ cần tự hỏi tại sao - nó đến từ đâu, và tại sao không phải là 1899-12-31 được sử dụng sau đó?Tại sao ngày 1899-12-30 không có ngày tháng trong Access/SQL Server thay vì 12/31?

+1

Bạn có thể cụ thể hơn không - trong phiên bản nào của SQL Server? Tôi muốn biết –

+0

Tại sao câu hỏi cấp Wikipedia này nhận được nhiều phiếu bầu cho cả câu hỏi lẫn câu trả lời? Tôi không thấy nó thuộc về SO chút nào. –

+0

Anh ấy hỏi, tôi trả lời, tôi không biết nó sẽ tạo ra phản ứng này. – birryree

Trả lời

41

Duy trì khả năng tương thích với Lotus 1-2-3 trở lại trong ngày, có lỗi trong đó nó nghĩ năm 1900 là năm nhuận (hoặc giả vờ?).

Giải thích quá dài để báo giá, nhưng vì mục đích tò mò, dưới đây là một số đoạn trích.

1900 không phải là một năm nhuận.

"Đó là lỗi trong Excel!" Tôi kêu lên.

"Vâng, không thực sự", Ed nói. "Chúng tôi phải làm theo cách đó bởi vì chúng tôi cần có thể nhập các trang tính Lotus 123".

"Vì vậy, đó là lỗi trong Lotus 123?"

"Vâng, nhưng có lẽ là một cố ý. Lotus phải phù hợp với 640K. Nếu bạn bỏ qua 1900, bạn có thể tìm ra nếu một năm nhất định là năm nhuận chỉ bằng cách xem hai bit bên phải là 0. Điều đó thực sự nhanh chóng và dễ dàng.Các chàng trai của Lotus có lẽ đã hình dung rằng nó không quan trọng đối với hai tháng đó trong quá khứ. Có vẻ như những kẻ Cơ bản muốn được hậu môn về hai tháng đó, nên họ đã di chuyển kỷ nguyên một ngày trở lại. "

Trên thực tế, con số này là một trong những lớn hơn số ngày thực tế. Điều này là do Excel hoạt động như thể ngày 1900-Feb-29 tồn tại. Nó đã không làm. Năm 1900 không phải là năm nhuận (năm 2000 là năm nhuận). Trong Excel, ngày sau 1900-Feb-28 là 1900-Feb-29. Trong thực tế, ngày sau 1900-Feb-28 là 1900-Mar-1. Đây không phải là một lỗi". Thật vậy, nó là do thiết kế. Excel hoạt động theo cách này bởi vì nó thực sự là một lỗi trong Lotus 123. Khi Excel được giới thiệu, 123 có gần như toàn bộ thị trường cho phần mềm bảng tính. Microsoft đã quyết định tiếp tục lỗi của Lotus để hoàn toàn tương thích. Người dùng chuyển từ 123 sang Excel sẽ không phải thực hiện bất kỳ thay đổi nào đối với dữ liệu của họ. Miễn là tất cả các ngày của bạn sau 1900-Mar-1, điều này sẽ không quan tâm.

+1

Câu trả lời tuyệt vời và một thực tế thú vị! :) –

+0

* Tôi chắc chắn hy vọng rằng nó không thực sự là một lỗi cố ý ... – Andy

+1

@Andy đọc [Đánh giá BillG đầu tiên của tôi - Phần mềm trên Joel] (https://www.joelonsoftware.com/2006/06/16/my-first-billg-review /), đó là một tối ưu hóa hơn, ít nhất là có vẻ như vậy. – Wolf

0

Để hiểu biết tốt nhất của tôi, loại ngày không tồn tại trong "SQL Server cũ". Nó đã được giới thiệu trong SQL Server 2008 có giá trị ngày bằng 0 tương ứng với 0001/01/01.

select cast(0x000000 as date),cast(CONVERT(date, '0001/01/01') as varbinary(max)) 
----------  -------- 
--0001-01-01 0x000000 

Báo cáo câu hỏi không có ý nghĩa. Loại ngày tháng đã tồn tại trong "SQL Server cũ", nó sẽ ngụ ý khả năng tương thích ngược bị hỏng của loại ngày trong SQL Server 2008.

Không có điểm nào trong việc trả lời (và upvote posts) trong câu hỏi với định nghĩa không xác định hoặc không chính xác điều kiện.

+0

Tôi có nghĩa là loại datetime trong SQL Server; Tôi đã nhìn thấy ngày đó được sử dụng để thiết lập mặc định trong quá khứ và tự hỏi tại sao. Đó là tất cả. –

0

Máy chủ SQL dường như trả về ngày này làm mặc định nếu nó không thể liên hệ với nguồn thời gian đã xác định của nó.

Tôi đã xảy ra lỗi này trong khi xảy ra sự cố chuyển đổi cụm khi hệ thống chấm công sinh trắc học của tôi đang chạy/đang được sử dụng.

Để đánh bại thao tác đồng hồ cục bộ, ai đó đồng hồ trong, tôi hỏi bản sao cụm SQL thời gian đó.

Không thể nhận nguồn thời gian hoạt động hợp lệ và trả về ngày này.

Khắc phục sự cố cho tôi là thẳng về phía trước bằng cách kiểm tra ngày này trong phụ số GetServerTime phụ của tôi và sử dụng thời gian máy tính cục bộ nếu 'mặc định' này được trả lại.

Tôi đã thấy điều này với SQL 2000/2005/2008, tất cả thông qua ADO và VB6.

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