2012-04-01 72 views
6

該場景是這樣的: 從某個表中選擇最大日期,當目標表沒有數據時,那麼最大日期爲空。當日期爲空時,我想獲得系統的最早日期,所以時代似乎是完美的。如何獲取SQL Server中的時代?

我已經搜索了包括DATEADD函數在內的一些方法,但看起來並不高雅。

+0

可能重複[在mssql中有什麼等價的php時間()?](http://stackoverflow.com/questions/5942002/whats-the-equivalent-of-php-time-in-mssql) – Corbin 2012-04-01 02:56:44

+0

等待...你的意思是在一個時代,特別是unix時代的時代嗎?此外,一個不存在的集合的最大值對我來說是有意義的。你爲什麼不喜歡空結果? – Corbin 2012-04-01 02:57:57

+0

@Corbin:en ...我想用這個時間作爲where條件。所以,如果它是空的,我需要改變哪裏不是我的pretension。最後,對於這種情況來說,一個時代似乎是完美的,不需要在where子句中進行更改。 我明確了自己嗎?\ – freeman 2012-04-01 05:13:50

回答

8

如果我正確理解你的問題,在SQL Server中的劃時代由cast(0 as datetime)給出:

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

如果定義時代爲1970年1月1日:更好:將其存儲在一個變量

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

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

可以存儲在SQL日期時間字段的最早日期取決於您使用的數據類型:

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 

更多具體細節請參閱從https://msdn.microsoft.com/en-GB/library/ms186724.aspx#DateandTimeDataTypes

如果您正在轉換的數字爲日期,但不相關的,如果你存儲日期爲日期的epoch是非常有用的。

如果您不想正確地處理空值,那麼簡單的答案就是選擇一個您知道的日期,並將其數據硬編碼到您的查詢中。 cast('1900-01-01' as datetime)將在大多數情況下工作。

雖然使用類似cast(0 as datetime)的東西會產生相同的結果,但會掩蓋您在代碼中完成的操作。有人維護它,想知道這些古老的日期從哪裏來,將能夠更快地發現硬編碼的日期。

相關問題