2016-01-22 116 views
0

我有兩個變量(即SQL表中的兩列),一個是日期時間格式,例如, 2011-12-31 00:00:00,另一種是整數格式,例如201203,我希望得到這兩個變量之間的差異,最有效的方法是什麼?謝謝。得到SQL服務器中日期/時間和整數值之間的差異

+0

你需要告訴我們這裏有很多的要求。你的日期之一有一天 - 另一天沒有。你想把你的約會當成沒有一天或你的絃樂一樣在同一天嗎? – Hogan

+0

字符串有不同的日子。我不在乎它是哪一天。我只需要不同的月份。謝謝。 –

+1

您應該停止在字符串列中存儲日期。如果您將日期時間值存儲在日期時間數據類型中,則這變得非常簡單。爲了獲得差異,你首先必須將它們轉換爲日期時間,然後使用DATEADD變得簡單。 –

回答

0

要解決您的問題,您需要將字符串或整數字段轉換爲日期時間字段,然後使用日期函數。

假設它是一個字符串字段:

create function dbo.DatePictureToDateTime(@datePicture varchar(20)) 
returns datetime 
as 
begin 
    return 
    case 
    -- YYYYMM case 
    when @datePicture like '[0-9][0-9][0-9][0-9][0-1][0-9]' 
    then convert(datetime, left(@datePicture, 4) + '-' + substring(@datePicture, 5, 2) + '-01', 121) 
    -- YYYYMMDD case 
    when @datePicture like '[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]' 
    then convert(datetime, left(@datePicture, 4) + '-' + substring(@datePicture, 5, 2) + '-' + substring(@datepicture, 7, 2), 121) 
    -- Add your own cases for different date strings you have 
    end 
end 

然後使用它是這樣的:

select dbo.DatePictureToDateTime(datePicture), datePicture 
from (
select '201103' as datepicture 
union all select '20110330' as datepicture 
)x 

如果日期字段是一個整數

dbo.DatePictureToDateTime(cast(dateInteger as varchar(20)) 

要轉換個月差異,請使用datediff

-- Datediff returns the number of period ends between the two datetimes 
-- in this case it returns the number of month ends, 
-- i.e. how many midnights on the last day of a month 
datediff(month, dateField, dbo.DatePictureToDateTime(datePictureField)) 

注DATEDIFF的定義:

  • 從一月31日至2月1日爲1天的差異,也爲1月的差異。
  • 從2月1日至2月28日是27天的差額,但個月。

如果這不是你想要的,你必須問另一個問題。日期計算很複雜。

0

的字符串轉換日期與(可能需要設定轉換格式)

CONVERT(DATE, @DateAsString) 

轉換的YearMonth詮釋到YearMonthDay(在第一個月)一個日期,然後到日期與

CONVERT(DATE, CAST((@DateAsInt*100 + 1) AS VARCHAR(10)), 101) 

因此,在一行:

DECLARE @DateAsInt INT = 201203 
DECLARE @DateAsString VARCHAR(19) = '2011-12-31 00:00:00' 

SELECT DATEDIFF(MONTH, CONVERT(DATE, @DateAsString), CONVERT(DATE, CAST((@DateAsInt*100 + 1) AS VARCHAR(10)), 101)) 
相關問題