2013-03-19 31 views
7

Nếu tôi muốn lưu trữ ngày và giờ, tốt hơn là lưu trữ chúng trong một ngày và giờ riêng biệt hoặc sử dụng một ngày giờ?Khi nào sử dụng ngày và giờ riêng biệt thay vì một ngày giờ riêng lẻ

Khi nào chúng ta nên sử dụng ngày giờ thay vì một ngày giờ?

Tôi muốn lọc truy vấn của mình bằng cách sử dụng ngày hoặc giờ.

+1

Tùy thuộc vào những gì bạn cần để sử dụng nó thực sự. Không có lý do chính đáng chỉ để sử dụng một theo mặc định. – CathalMF

Trả lời

5

Trong SQL Server 2008, bạn có date and time data types để điều này trở thành một vấn đề không.

Nếu đó là lựa chọn tốt, điều đó thực sự tùy thuộc vào doanh nghiệp của bạn và cách bạn sẽ truy vấn dữ liệu của bạn.

Nếu ví dụ bạn muốn biết tất cả các nơi đơn đặt hàng từ 1 đến 02:00 cho bất kỳ ngày sử dụng một tách DateTime cột sẽ làm cho nó nhanh hơn

+0

Đó là một điểm thú vị với các truy vấn nhanh hơn chỉ trong khoảng thời gian. Bạn có bất kỳ dữ liệu để chứng minh rằng hoặc là điều này dựa trên một cấu trúc chỉ số reg giả định? –

+1

Truy vấn dữ liệu bằng cách sử dụng cột DATETIME chỉ lọc theo thời gian sẽ phức tạp hơn vì yêu cầu quét –

+0

Đúng, tôi muốn truy vấn dữ liệu của mình bằng cách sử dụng ngày bất kỳ lúc nào hoặc thời gian cho bất kỳ ngày nào. – Harke

1

Từ quan điểm kỹ thuật, ngày luôn có Ngày và giờ luôn là ngày. Nếu bạn lưu trữ một thời gian trong cơ sở dữ liệu nó có một ngày mặc định được áp dụng cho nó. Nếu bạn lưu trữ chỉ là Ngày giờ sẽ là nửa đêm vào ngày đó (00:00:00).

Theo tôi, cách tốt nhất để lưu trữ cả hai với nhau là các hàm có thể được áp dụng trên một trường phù hợp, cho dù bạn cần phải so sánh ngày hoặc giờ.

+2

eh - không. Nó phụ thuộc vào ngữ cảnh là gì. Ví dụ: giờ làm việc của nhà hàng có các thành phần thời gian không có ngữ cảnh ngày cố định và Ngày Valentine diễn ra vào ngày 14 tháng 2 mà không có thời gian cụ thể nào liên quan. –

+0

Tôi sẽ cập nhật bài đăng của mình. Tôi có nghĩa là trên một mức độ kỹ thuật, mặc dù hy vọng rằng sẽ được rõ ràng bằng cách viết hoa được sử dụng trên các từ ngày và thời gian. – aaroncatlin

8

Khi bạn đang nói về một thời điểm trong thời gian, cho dù một thời điểm phổ biến hoặc ngày và giờ cụ thể trên lịch địa phương của ai đó, bạn sử dụng datetime. Nếu bạn muốn chắc chắn rằng bạn đang nói về một thời điểm chính xác trong thời gian, bất kể người quan sát, thì bạn sử dụng một datetimeoffset.

Nếu bạn đang lưu trữ chỉ date thì nghĩa là ngày không có thành phần thời gian, có nghĩa là "bất kỳ lúc nào vào ngày này".

Nếu bạn đang lưu trữ chỉ time thì nghĩa là thời gian không có thành phần ngày, có nghĩa là "lần này vào bất kỳ ngày nào" hoặc "lần này vào ngày được xác định bởi một số phương tiện khác".

Không có purpouse thực tế nào để có cả số datetime tương tự như vậy, ngồi trên cùng một hàng. Chỉ cần sử dụng datetime cho điều đó.

1

Không có gì tuyệt vời về ngày tháng và thời gian tách,

Better giúp bạn tiết kiệm thời gian và thời gian trong cùng cột,

Ở đây họ đã thảo luận về vấn đề tương tự kiểm tra xem nó: are-there-any-good-reasons-for-keeping-date-and-time-in-separate-columns

bạn cũng có thể có được ngày và thời gian riêng biệt theo truy vấn

SELECT 
    CONVERT(VARCHAR(10),GETDATE(),111) as DatePart, 
    convert(varchar(15), getdate(), 108) TimePart 
+0

Trên thực tế có một số lý do rất tốt để tách chúng. Ví dụ sử dụng datatype Date khi bạn không quan tâm về thời gian .. nói dateofbirth .. theo cách đó các phép tính độ tuổi của bạn đơn giản hơn rất nhiều. Kiểu dữ liệu thời gian là tuyệt vời để thực hiện các phép tính dịch chuyển. Tôi muốn mọi người làm việc lúc 5 giờ chiều bất kể ngày nào. Bạn có thể chia chúng ra như bạn đã làm nhưng sau đó chúng là varchar và một số tính toán trở nên khó khăn hơn nhiều. Lớn hơn '01: 00: 00 PM 'hoặc '12: 30: 00 AM'? –

2

Nếu bạn cố tình không quan tâm đến thời gian, sẽ hiệu quả hơn khi lưu trữ thứ là dữ liệu dưới dạng kiểu dữ liệu ngày tháng. Hãy suy nghĩ một cột sinh nhật của khách hàng, không có quá nhiều trường hợp tôi có thể nghĩ về điều đó sẽ sử dụng thời gian này. Nếu có một thời gian gắn liền với nó (thường là một lỗi), điều này cần phải được loại bỏ thông qua một câu lệnh chuyển đổi để so sánh. Nó cũng tiêu thụ thêm không gian nếu bạn không cần những giá trị này (3 byte so với 8).

Tôi nghĩ rằng nó tương tự như có bảng mã trạng thái với id là một bigint thay vì một tinyint hoặc tương tự (tùy thuộc vào số lượng mã trạng thái bạn dự định có).

Nó chỉ là vấn đề của những gì bạn đang sử dụng dữ liệu, nếu bạn nghĩ rằng có một cơ hội tốt bạn sẽ cần đến dữ liệu đó, sau đó sử dụng datetime, nếu không sử dụng ngày.

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