2012-04-01 33 views
6

Kịch bản này là: chọn ngày tối đa từ một số bảng, khi bảng mục tiêu không có dữ liệu, vì vậy ngày tối đa là rỗng. khi ngày tháng không có giá trị, tôi muốn có được ngày tháng sớm nhất của hệ thống, vì vậy thời gian kỷ nguyên có vẻ hoàn hảo.Làm thế nào để có được thời gian kỷ nguyên trong SQL Server?

Tôi đã tìm kiếm một số cách bao gồm các hàm DATEADD, nhưng điều đó có vẻ không thanh lịch.

+0

có thể trùng lặp của [Thời gian tương đương với thời gian php() trong mssql là gì?] (Http://stackoverflow.com/questions/5942002/whats-the-equivalent-of-php-time-in-mssql) – Corbin

+0

Chờ ... Bạn có nghĩa là kỷ nguyên như trong một kỷ nguyên nói chung, hoặc đặc biệt là kỷ nguyên unix? Ngoài ra, tối đa của một tập không tồn tại được null có ý nghĩa với tôi. Tại sao bạn không thích kết quả null? – Corbin

+0

@Corbin: vi ... Tôi muốn sử dụng thời gian này như là một điều kiện nơi. vì vậy, nếu nó là null, tôi cần phải thay đổi nơi khoản mà không phải là giả định của tôi. Cuối cùng, thời gian epoch có vẻ hoàn hảo cho kịch bản này, không có thay đổi nào cần phải ở trong mệnh đề where. Tôi có tự xóa mình không? \ – freeman

Trả lời

8

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, trong SQL Server kỷ nguyên được đưa ra bởi cast(0 as datetime):

select Max(ISNULL(MyDateCol, cast(0 as datetime))) 
from someTable 
group by SomeCol 
0

Nếu bạn xác định các thời đại như ngày 01 Tháng 1 năm 1970: Các tốt hơn: để lưu trữ nó trong một biến

DECLARE @epoch DATETIME 
SET  @epoch = CONVERT(DATETIME, '01 JAN 1970', 106) 

select 
DATEPART(YEAR, DATEADD(day, 180, @epoch)) as year, 
... 
3

ngày sớm nhất có thể được lưu trữ trong một lĩnh vực SQL datetime phụ thuộc vào loại dữ liệu bạn sử dụng:

datetime: 
    1753-01-01 through 9999-12-31 

smalldatetime: 
    1900-01-01 through 2079-06-06 

date, datetime2 and datetimeoffset: 
    0001-01-01 through 9999-12-31 

Để biết thêm chi tiết chính xác, hãy xem từ https://msdn.microsoft.com/en-GB/library/ms186724.aspx#DateandTimeDataTypes

epoch là hữu ích nếu bạn đang chuyển đổi số thành ngày, nhưng không liên quan nếu bạn đang lưu trữ ngày tháng.

Nếu bạn không muốn đối phó với null đúng cách, câu trả lời đơn giản là chọn một ngày mà bạn biết sẽ có trước dữ liệu và mã hóa nó vào truy vấn của bạn. cast('1900-01-01' as datetime) sẽ hoạt động trong hầu hết các trường hợp.

Trong khi sử dụng một cái gì đó như cast(0 as datetime) tạo ra cùng một kết quả, nó che khuất những gì bạn đã thực hiện trong mã của mình. Một người nào đó duy trì nó, tự hỏi những ngày tháng cũ kỳ lạ này đến từ đâu, sẽ có thể phát hiện ra ngày được mã hóa cứng nhanh hơn.

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