2009-04-05 35 views

Trả lời

38

Tôi khuyên bạn nên sử dụng một thời gian dài để thể hiện số lượng ticks. Đó là những gì TimeSpan sử dụng làm đại diện nội bộ của nó. Điều này cho phép bạn dễ dàng hoàn nguyên đối tượng của mình bằng phương thức Timespan.FromTicks() và xuất ra cơ sở dữ liệu bằng cách sử dụng Timespan.Ticks property. Đơn vị nhỏ nhất của thời gian trong .NET là dấu tích, tương đương với 100 nano giây

+2

Đó là chính xác những gì tôi đang làm về dự án tôi đang làm việc trên. Lớp ORM sau đó thực hiện chuyển đổi như bạn đã nói, giữa TimeSpan và ve, qua lại, không có chỗ cho lỗi. Ngoài ra, một phần thưởng phụ là bạn đã có tất cả độ chính xác mà bạn có thể sẽ cần. Nếu bạn gắn bó với phút, bạn đã có một vấn đề thực sự nếu bạn bộ phận tiếp thị nói "Làm thế nào nó sẽ được để có được độ chính xác xuống giây?" –

+0

Tốt, dù là một lần đánh dấu được bảo đảm để nhận chính xác 100 nano giây? – SepehrM

+0

Tài liệu khung không đề cập đến bất kỳ phòng lung linh nào: https://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx –

1

SQL CE không có loại thời gian hoặc loại do người dùng xác định, do đó, lựa chọn của bạn là datetime hoặc int đại diện phút. Nếu thời gian lớn nhất bạn cần lưu trữ là 23:59 = 23 * 60 + 59 = 1439 = số phút trong một ngày bắt đầu từ phút 0, smallint là loại tích phân nhỏ nhất sẽ phù hợp với phạm vi đó.

Chống lại sự cám dỗ để lưu trữ giờ và phút trong các cột riêng biệt dưới dạng các vết lốm đốm. Điều đó sẽ sử dụng cùng một không gian như một smallint duy nhất, nhưng sau đó mọi phép tính của thời gian sẽ yêu cầu nhân giờ bằng 60 và thêm phút, và mỗi order by sẽ yêu cầu hai cột thay vì một.

Lưu trữ dưới dạng phút; trưng bày, bạn có thể tách thành giờ phút và phút với

select floor(absminutes/60) as hours, absminutes % 60 as minutes, 
from some table 
order by absminutes; 

Tôi muốn đặt tên cho cột (s) minutes, hoặc absminutes (phút tuyệt đối) nếu bạn muốn phân biệt biên bản 1439 trong một ngày từ 0-59 phút trong một giờ.

Để chuyển đổi từ giá trị cơ sở dữ liệu sang đối tượng thời gian, hãy sử dụng ctor Timespan(int, int, int) như thế này new TimeSpan(floor(absminutes/60), absminutes % 60, 0) hoặc (tốt hơn) ctor Timespan(long) với new Timespan(absminutes * TimeSpan.TicksPerMinute).

Để chèn hoặc cập nhật cơ sở dữ liệu từ đối tượng Thời gian, đặt thành vô hiệu thành someTimespan.TotalMinutes % 1440.

1

Lưu trữ dưới dạng varchar. Lưu vào sql sử dụng TimeSpan.ToString(). Đọc từ sql là:

TimeSpanObj = TimeSpan.Parse(fieldValue) 
+3

Tại sao điều này lại bị giảm giá? Đó là một gợi ý hợp pháp và nếu bạn phải chỉnh sửa trực tiếp dữ liệu SQL, sẽ dễ dàng hơn khi viết "2 phút" là ''00: 02'' thay vì '1200000000' –

0

Tôi hiện đang xem xét sử dụng SQL Thời gian để xử lý, nhưng nó sẽ không hoạt động> = 24 giờ.

Lợi ích bao gồm dễ đọc, dễ sử dụng trong cả SQL và mã, nhưng sự sụp đổ là bạn chỉ có một khoảng thời gian nhỏ để chơi cùng.

declare @delay table (DelayTime Time(3)) 
insert into @delay values ('00:10:00.000') 
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay 

SqlDataReader dr = cmd.ExecuteReader(); 
DelayTime = (TimeSpan) dr["DelayTime"]; 
Các vấn đề liên quan