Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取SQL server中日期/时间与整数值之间的差值_Sql Server_Datetime_Difference - Fatal编程技术网

Sql server 获取SQL server中日期/时间与整数值之间的差值

Sql server 获取SQL server中日期/时间与整数值之间的差值,sql-server,datetime,difference,Sql Server,Datetime,Difference,我有两个变量(即SQL表中的两列),一个是日期时间格式,如2011-12-31 00:00:00,另一个是整数格式,如201203,我想得到这两个变量之间的月差,最有效的方法是什么?谢谢 要解决您的问题,您需要将字符串或整数字段转换为日期时间字段,然后使用日期函数 假设它是一个字符串字段: create function dbo.DatePictureToDateTime(@datePicture varchar(20)) returns datetime as begin return

我有两个变量(即SQL表中的两列),一个是日期时间格式,如2011-12-31 00:00:00,另一个是整数格式,如201203,我想得到这两个变量之间的月差,最有效的方法是什么?谢谢

要解决您的问题,您需要将字符串或整数字段转换为日期时间字段,然后使用日期函数

假设它是一个字符串字段:

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的定义:

  • 从1月31日到2月1日,相差1天,也相差1个月
  • 从2月1日到2月28日相差27天,但个月

如果这不是你想要的,你必须问另一个问题。日期计算很复杂。

将字符串日期转换为日期(可能需要设置转换格式)

将YearMonth Int转换为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))

你需要在这里告诉我们很多要求。你的一个约会有一天,另一个没有。要将日期视为没有日期,还是将字符串视为始终在同一天?字符串有不同的日期。我不在乎今天是哪一天。我只需要一个月的差额。谢谢。你应该停止在字符串列中存储日期。如果将datetime值存储在datetime数据类型中,这将变得非常简单。要获得差异,您首先必须将这些数据转换为datetime,然后使用DATEADD变得简单。
最有效的方法是什么?
使用datetime字段保存日期\时间。我得到了数据…我没有创建它。。。。。
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))