2012-07-12 118 views
2

我對SQL比較陌生,所以請原諒我,如果這是一個愚蠢的問題。現在我一直在嘗試太久以使其發揮作用。將float(YYYY)轉換爲datetime

我在表A中有一列是一個名爲ConstructionYear的浮動列。它有一個簡單的4位數年份(即2010年,2005年,1972年等)。我需要使用這些年來填充表B的YearBuilt日期時間字段。我搜索並搜索並嘗試了各種我在網上找到的convert()和cast()的不同組合,但它不起作用。

我想發生是這樣的:

'2008' - > '2008-01-01 00:00:00.000'

'2005' - >「2005-01- 01 00:00:00.000'

'1986年' - > '1986年1月1日00:00:00.000'

而不是什麼正在發生的事情(使用CAST(ConstructionYear AS DATETIME)):

'2008' - > '1905年7月2日00:00:00.000'

'2010' - > '1905年7月4日00:00:00.000'

'1984' - > '1905年6月8日00:00:00.000'

編輯:解決方法:cast(convert(varchar,@ConstructionYear) AS DATETIME)

所以我的問題有2個主要原因(比我是新來的SQL等)。

  1. 我不知道SQL Server用於datetime的1900年代。因爲1905年的所有日期我都看到了,但我不知道它是在考慮我的2005年並將它算作1900年的日子。

  2. 1753年。爲什麼1753年我們可以使用最早的一年?在我發佈我的問題之前,我可能在某個時候使用了正確的語法,但它沒有運行,因爲我的數據在1753年前已經有好幾年了。我認爲錯誤與我的代碼有關。

+2

在這種情況下,Float似乎是一種存儲整數的不好方法。根據字段的填充方式,你可能會稍微偏離需要被截斷或舍入到(小)int或char(4) – automatic 2012-07-12 23:02:05

+0

之前舍入的值。同意,int列會更合適,以免得到一個1984.535在那裏以某種方式 – Ghost 2012-07-12 23:08:37

+0

同意。我不幸地無法控制這些表格的結構,或者它們最初是如何由我們的客戶填充的。 – tkrex 2012-07-12 23:25:44

回答

4

檢查這個例子:

DECLARE @ConstructionYearas FLOAT 
SET @ConstructionYear = 2012 
SELECT FloatToDatetime = CAST(convert(varchar(4),@ConstructionYear) as datetime) 

它將歐tput的:

2012-01-01 00:00:00.000


基本上使用:

CAST(convert(varchar(4),@ConstructionYear) as datetime)

其中@ConstructionYear是您Float可變

希望它能幫助!

+0

非常真@AaronBertrand我不知道我錯過了那個,thx! – Luis 2012-07-12 23:17:18

+1

我只是不喜歡在使用varchar的時候可以將浮點數,**號**,*作爲數字*。改用日期數學!我是一名經驗豐富的SQL Server開發人員/ dba,我甚至都不知道Convert(datetime,'2012')會工作......這不是我書中的有效日期。我不相信它。我相信我的直覺。我不能爲這個答案投票。 – ErikE 2012-07-13 05:17:02

1

這應該工作,但有可能是一個更好的辦法

CAST(CAST(ConstructionYear as nvarchar(4)) + '-01-01' as datetime) 

你的查詢做的是您所提供的天數並將其添加到SQL服務器的時代,1900年1月1日,它給你看到的結果

1
DECLARE @y FLOAT; 
SELECT @y = 2012; 
SELECT DATEADD(YEAR, @y-1900, 0); 

你爲什麼想直接轉換爲數字值2012幾年?實際上,在SQL Server中,數值將轉換爲自1900-01-01以來的天數。所以下面應該產生相同的結果:

SELECT CONVERT(DATETIME, 2012); 
SELECT DATEADD(DAY, 2012, '19000101'); 

正如其他人的建議,我強烈建議你正確地存儲這些數據。雖然你可以使用一些像SMALLINT更安全一些,爲什麼不使用DATE?這具有內置驗證功能,可以直接使用各種日期/時間功能而無需轉換,並且不存在您可能遇到的任何類似FLOAT等近似數據類型的固有舍入問題。如果您要存儲日期,請使用日期數據類型。

+0

我可以清楚地看到日子裏發生了什麼,因爲將年份增加1會使日期時間增加1。我只是不知道1900年是基準年。 此外,我完全同意FLOAT不是存儲此數據的適當方式。我希望我能改變這些桌子的結構,但不幸的是,他們是按原樣交給我的。 – tkrex 2012-07-12 23:22:09

+1

這是此頁面上的最佳答案。使用日期數學和日期函數。不要做愚蠢的字符串操作。人們(而不是亞倫),當它被格式化爲人類的理解時,不要去思考它如何顯示給你。開始思考計算機如何與代表價值的底層數據一起工作! – ErikE 2012-07-13 05:14:55

相關問題