2009-02-04 32 views
10

Cách tốt nhất/hiệu quả nhất để lưu trữ ngày cũ (pre-1753) trong SQL Server 2005 là gì? Tôi không quan tâm đến thời gian lưu trữ - chỉ là ngày tháng. Kiểu dữ liệu datetime của SQL Server chỉ có thể giữ ngày tháng 1 năm 1753. Tài liệu MSDN nói rằng có kiểu dữ liệu ngày và datetime2, nhưng SQL Server Management Studio dường như không hỗ trợ chúng (Lỗi: kiểu dữ liệu không hợp lệ).Cách tốt nhất để lưu trữ ngày cũ trong SQL Server

Làm cách nào để lưu trữ ngày tháng dưới dạng chuỗi hoặc ints của biểu mẫu "YYYYMMDD"? Tôi làm rất nhiều truy vấn và phân loại trên hai trường ngày trong bảng của tôi (StartDate và EndDate).

CẬP NHẬT:

Đã có một số đề xuất bên dưới để lưu trữ năm, tháng và ngày trong các trường riêng biệt. Lợi ích của việc lưu trữ các phần trong các trường khác nhau hơn là trong một trường số nguyên duy nhất là gì?

+0

Sử dụng 3 số nguyên thay vì 1 số có lợi thế là bạn không cần tính số ngày, như được đề xuất bởi CodeMonkey1 . Điều đó khó hơn âm thanh. – Treb

+0

Những ngày liên quan đến điều gì? Bạn có thể [cần phải xem xét vấn đề Gregorian vs Julian Calendar] (http://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server/3310588#3310588) –

Trả lời

15

Loại date chắc chắn là những gì bạn muốn sử dụng. Phạm vi của nó là "ngày 1 tháng 1, 1 tháng 1 đến hết ngày 31 tháng 12 năm 9999 sau Chúa". Nó cũng chỉ lưu trữ thông tin ngày, không có phần thời gian.

Bạn, có lẽ, sử dụng SSMS 2005, thay vì năm 2008 hoặc được kết nối với phiên bản 2005? Loại đó là introduced in SQL Server 2008. Nếu bạn có khả năng sử dụng một cơ sở dữ liệu năm 2008, tôi sẽ nghĩ rằng nó không thể nghi ngờ là con đường để đi.

+0

nghe như một lý do để nâng cấp! – inspite

4

Tôi chưa bao giờ làm điều này nhưng có thể bạn có thể lưu trữ ngày dưới dạng số nguyên đại diện cho số ngày kể từ ngày tối thiểu phù hợp với bạn. Sau đó, bạn có thể tạo bảng tra cứu để ánh xạ các số nguyên đó thành năm, tháng và ngày hoặc bạn có thể viết các hàm do người dùng xác định để chuyển đổi từ một số nguyên thành ngày hoặc ngược lại.

Điều đó sẽ khá hiệu quả về lựa chọn và sắp xếp.

4

Chuỗi có thể kém hiệu quả hơn chỉ lưu trữ số nguyên cho năm, tháng và ngày. Đó là một chút khác biệt trong các truy vấn của bạn, nhưng chúng có thể chạy nhanh hơn khi bạn có thể lập chỉ mục chúng theo những cách có ý nghĩa đối với các loại truy vấn bạn đang thực hiện.

Vì vậy, ví dụ:

CREATE TABLE myOldDates (
    year INT, 
    month INT, 
    day INT, 
    -- otherstuff ... 
) 

Sau đó, tất cả các truy vấn sẽ như thế nào:

-- get records between 5/15/1752 and 3/19/1754 
SELECT * FROM myOldDates 
    WHERE 
    (year = 1752 AND ((month = 5 and day >= 15) or month > 5) OR year > 1752) 
    AND (year = 1754 AND ((month = 3 and day <= 19) or month < 3) OR year < 1754) 

Đó là xấu xí, để chắc chắn, nhưng đó là về như xấu xí như nó được cho các truy vấn nhiều, vì vậy một khi bạn viết nó lần đầu tiên, bạn có thể đóng gói nó trong một hàm.

1

Một vấn đề với việc lưu trữ ngày ở định dạng YYYYMMDD là bạn có thể kết thúc với những ngày không tồn tại (ví dụ: 16000231 - ngày 31 tháng 2 không tồn tại). Bạn sẽ cần phải làm một số phía khách hàng xác nhận, trước khi nhập nó vào db.

Điều tương tự cũng đúng với việc lưu trữ ngày theo số nguyên năm, tháng và ngày, như được đề xuất bởi Ian Varley. Nhưng aisde từ đó tôi thích câu trả lời của mình và chỉ muốn tôi sẽ nghĩ về nó ;-)

+0

Mỗi máy khách thích hợp làm gì với dữ liệu nhận được từ bất kỳ nguồn bên ngoài nào? :) (gợi ý: xác thực) – Esko

+0

Yup. Chỉ cái gì đó của nó thay thế có thể bị bỏ qua khi xử lý các ngày tháng, bởi vì các kiểu ngày tháng dựng sẵn thực hiện việc xác thực cho bạn. – Treb

1

YYYYMMDD = 8 byte. Bạn có thể cắt giảm xuống 4 byte với SMALLINT và TINYINT bằng 3 cột.

1

Sử dụng ints như được gợi ý bởi CodeMonkey1 có vẻ như là một ý tưởng hay và sẽ giúp việc "tính toán ngày" dễ dàng hơn (ví dụ: một số ngày + XX ngày).

Viết một số UDF (cũng như lời khuyên của CodeMonkey1) để chuyển đổi int -> YYYYMMDD -> int và bạn sẽ có sự linh hoạt mà Ian Varley đề cập trong câu trả lời của mình.

1

Ý tưởng - nếu bạn có một số kiến ​​thức .NET, bạn có thể tạo kiểu CLR để lưu trữ ngày, về cơ bản đó sẽ là ngày giờ. Nếu bạn đang thực hiện nhiều phép tính với ngày thay vì truy vấn đơn giản, có thể điều gì đó cần điều tra

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