2011-01-31 75 views
2

我需要使用sql server在日期時間中轉換年,月和日的int值。將int值轉換爲sql服務器中的datetime

實際上我」我使用這個

DECLARE @MONTH INT 
DECLARE @YEAR INT 
DECLARE @DAY INT 
DECLARE @MAXDATE DATETIME 
DECLARE @MINDATE DATETIME 

SET @MONTH=12 
SET @YEAR=2010 
SET @DAY=1 


SET @MINDATE=CONVERT(DATE,CAST (@YEAR AS VARCHAR)+ RIGHT ('0'+ CAST (@MONTH AS VARCHAR),2) + RIGHT ('0'+ CAST (@DAY AS VARCHAR),2)) 

SELECT @MINDATE 

和工作正常,但如果有更好的方法將這些值轉換我想知道。

回答

5

這將是一個有點簡單:

select dateadd(month,(@YEAR-1900)* 12 + @MONTH - 1,0) + (@DAY-1) 
1

我認爲你絕對有正確的方法來做到這一點。您已經填充了個位數和月份的零;您的解決方案將運行良好,而不是不整潔。

唯一的另一種方式是與一些任意的日期,並'添加'年,月和日的起點。然而,這並不是一個很好的計劃,因爲你需要在12月31日,公元0時開始計算。與僅僅解析組件一樣,這與您目前正在做的事情沒有多大關係。

0

,直到我知道there's沒有辦法CON一個內置的功能轉換。 如果it's可以聲明年月日安達爲varchar,它可以更容易:

SET DATEFORMAT YMD; 
SET @MAXDATE = @YEAR+'/'[email protected]+'/'[email protected] 
SELECT @MAXDATE 
+2

你肯定**這可以在SQL Server上使用例如「德語」日期格式激活?我非常懷疑它 - 如果你做這樣的事情(字符串連接),然後**請**:使用ISO-8601格式! `YYYYMMDD` - 可以在任何系統上運行,任何語言設置... – 2011-01-31 05:49:56

1

根據你所說的「更好的方式」是什麼,你可能會發現不同的答案可以接受的。 例如,從字符串轉換可能會比在腳本中完成更簡單(因此更好)。就像這樣:

SET @MINDATE = CAST(@YEAR AS varchar) + '-' + 
       CAST(@MONTH AS varchar) + '-' + 
       CAST(@DAY AS varchar) 

也就是說,如果你的變量是datetime,轉換將是隱含的,所以沒有必要使用CONVERT。這裏選擇的格式是YYYY-MM-DD,或者更確切地說YYYY-M-D,就我所知,這是隱式轉換可以接受的,而不管區域設置如何。

編輯:你選擇的格式,YYYYMMDD,也是語言環境獨立,如果我沒有弄錯的話。我的觀點只是它需要一個更復雜的表達式來從整數中構建正確的字符串,這似乎給您帶來不便。