[英]T-SQL datetime conversion
我正在使用第三方數據庫,它(無論出於何種原因)內部以yyyymm
格式存儲日期,例如Dec 2012
201212
作為INT
。
有沒有一種簡單的方法可以將其轉換為SQL Server DateTime
類型?
我已經嘗試手動將上面的內容轉換為長度為6的char seq,將其與'01'連接以獲得給定月份的開頭,如下所示:
(CONVERT(char(6), Period) + '01')`
然后將其包裝在datetime
轉換中:
CONVERT(datetime, (CONVERT(char(6), Period) + '01'))
但這似乎扔了;
從字符串轉換日期和/或時間時轉換失敗
誰能說清楚我做錯了什么呢?
謝謝! :)
這是一種方法:
Declare @val as int = 20121231;
select DATEADD (YEAR,@val/10000-1900,DATEADD(MONTH,(@val%10000)/100-1,DATEADD(DAY,@val%100-1,0 )))
這是另一個:
Declare @val as int = 20121231;
Cast(Cast(@val as char(8)) as date)
第一個是好的,因為你不會有任何區域設置依賴。 第二個是好的,因為它很簡短。
您需要使用正確的參數。 這是msdn圖表http://msdn.microsoft.com/en-us/library/ms187928.aspx
在你的情況下,我相信你需要附加'01'並使用它
declare @val VARCHAR(8)
SET @val = '201212'
set @val = @val + '01'
print CONVERT(DATETIME, @val, 12)
12是ISO格式,將采用yymmdd或yyyymmdd
這應該做的事情:
DECLARE @Period INTEGER = 201212
SELECT CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )
將整數轉換為yyyy-mm-dd
樣式字符串:
select convert(datetime,
left(cast(dt as char(6)),4) + '-' +
right(cast(dt as char(6)),2) + '-01',
121) -- 121 = ODBC = yyyy-mm-dd hh:mi:ss.mmm (24h)
from YourTable
您可以使用一些簡單的數學運算,盡可能避免使用字符串:
declare @Start int
set @Start = 201212
select DATEADD(month,((@Start/100)-1970)*12 + (@Start%100-1),'19700101')
話雖這么說,我已經預料到你最初發布的是什么,因為YYYYMMDD
是一種明確的格式。
如果您從可能包含一系列值的表中選擇這些值,只有其中一些是這些值,並且您依賴WHERE
子句在轉換發生之前過濾掉無效值,那么您就不在運氣 - SQL Server有一個討厭的習慣,即可以按照自己喜歡的順序應用過濾器和轉換。
如果是這種情況,請將過濾步驟(以排除無效的Period
值)移動到填充表變量或臨時表的單獨查詢中,然后在單獨的查詢中對這些值執行轉換。
你可以使用如下:
Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM
我發現以下內容非常有效。 假設您的日期的INT是YYYYMM格式。 首先乘以100,然后加1(這導致一個帶有DD為01的INT),所以你現在有YYYYMMDD而不是YYYYMM。 然后在轉換為DATETIME之前強制轉換為CHAR(8)。 希望對你有效。
DECLARE @SourceDT INT = 201212
SELECT CAST( CAST((@SourceDT * 100) + 1 AS CHAR(8)) AS DATETIME)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.