2016-01-22 114 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)) 
相关问题