2011-10-08 30 views
6

Tôi có một bảng với hai cột cột đầu tiên là dấu thời gian (currentdate) và cột kia là cột ngày giờ (dateReturn) .ii cần có sự khác biệt giữa currentdate và dateReturn từ số ngày. khả thi?timestamp và datetime

Trả lời

9

Không, điều này là không thể.

Trái ngược với niềm tin phổ biến (và tên chính nó), một cột timestampkhông thực sự liên quan đến thời gian.

Disclaimer: Câu trả lời này là cụ thể cho Sql Server (theo các thẻ của câu hỏi), động cơ sở dữ liệu khác có thể có triển khai khác nhau ở đây. *

Thay vào đó, nó là số 64 bit tăng đều đặn. Giá trị của số được chia sẻ giữa tất cả các bảng trong một cơ sở dữ liệu duy nhất có cột dấu thời gian như vậy. Nói cách khác, nếu bạn có hai bảng như vậy, sửa đổi một hàng trong một, và sửa đổi một hàng trong khác, giá trị của dấu thời gian trong bảng đầu tiên sẽ là X, và trong bảng thứ hai sẽ là X + 1.

as per the documentation of timestamp:

Mỗi cơ sở dữ liệu có được một bộ đếm được tăng lên cho mỗi chèn hoặc cập nhật hoạt động được thực hiện trên một bảng có chứa một cột timestamp trong cơ sở dữ liệu. Bộ đếm này là dấu thời gian cơ sở dữ liệu. Điều này theo dõi thời gian tương đối bên trong cơ sở dữ liệu, không phải thời gian thực có thể được liên kết với đồng hồ.

Như vậy, giá trị không liên quan đến ngày và/hoặc thời gian thực tế hàng được chèn hoặc sửa đổi lần cuối và không thể chuyển đổi thành ngày/giờ theo bất kỳ cách nào.

Mục đích duy nhất của cột timestamp là phải có thứ gì đó độc đáo, được đảm bảo sẽ tăng lên. Vì giá trị là 64 bit, bạn sẽ có quyền truy cập vào các hoạt động 18 446 744 073 709 551 616 yêu cầu cột timestamp trước khi đặt lại giá trị. Nếu bạn có một cơ sở dữ liệu có thể xử lý một triệu hoạt động như vậy mỗi giây, bạn sẽ vẫn phải chờ khoảng 584 554 năm trước khi giá trị đặt lại, vì vậy tôi sẽ nói nó đáp ứng các yêu cầu duy nhất.

+0

Hầu hết thời gian, cột dấu thời gian có nghĩa là cột có loại "datetime" và đặt tên "dấu thời gian". Cột có loại "dấu thời gian" tương đối hiếm. – Andomar

+4

Trong trường hợp này, anh ta nói cụ thể một cột là một ngày giờ và một dấu thời gian khác. –

+0

Nói cách khác, tên 'currentdate', là một bit của một từ sai. Nếu trường được cho là giữ ngày tháng và thời gian sửa đổi cuối cùng (hoặc chèn ban đầu), thì dấu thời gian 'là kiểu dữ liệu sai, và cột ngày giờ và kích hoạt hoặc tương tự là phù hợp hơn. –

4

Loại dữ liệu timestamp trong máy chủ sql không lưu trữ ngày hoặc giờ. Nó là nhiều hơn một phiên bản duy trì cột được cập nhật mỗi khi hàng được cập nhật. Vì vậy, bạn nên xem xét lại kiểu dữ liệu của cột này

-1

Nếu cột của bạn có loại tương đối (tương đối hiếm) timestamp, câu trả lời của Lasse V. Karlsen là đúng.

Nếu cả hai cột có kiểu datetime, bạn có thể:

select datediff(day, dateReturn, currentdate) 
from YourTable 

Xem datediff function.