DATEDIFF SQL 服务器 2016 JSON

DATEDIFF SQL Server 2016 JSON

目前有一个 startDate 和 EndDate 格式为 JSON 并尝试使用 DATEDIFF 函数通过 OPENJSON.

计算出年份差异

我目前正在尝试以下

DECLARE @Json VARCHAR(4000) = '
{
  "Name": "bob",
  "StartDate": "12/02/2015",
  "EndDate": "12/02/2016"
}';



SELECT  Name ,
        StartDate ,
        EndDate
FROM    OPENJSON(@Json, '$')
WITH (Name VARCHAR(50), StartDate DATETIME2, EndDate DATETIME2
,DATEDIFF(YEAR, StartDate DATETIME2, EndDate DATETIME2) INT AS Duration
)
WHERE Name = 'bob'

但是,我收到错误消息:

Msg 102, Level 15, State 1, Line 15
Incorrect syntax near '('.

有人知道是否可以做我正在做的事情吗?或者提出另一种方式?我想避免创建一个临时文件 table,插入其中,然后尽可能使用 select 上的 DATEDIFF 从中读取。

我没有使用过 OPENJSON,但是 WITH 部分不应该包含 Duration 列的定义而不是 DATEDIFF 然后移动DATEDIFFSELECT。像这样:

DECLARE @Json VARCHAR(4000) = '
{
  "Name": "bob",
  "StartDate": "12/02/2015",
  "EndDate": "12/02/2016"
}';

SELECT  Name ,
        StartDate ,
        EndDate ,
        DATEDIFF(YEAR, StartDate, EndDate) AS Duration
FROM    OPENJSON(@Json, '$')
WITH (Name VARCHAR(50), StartDate DATETIME2, EndDate DATETIME2, Duration INT
)
WHERE Name = 'bob'

或者只执行 SELECT 中的 DATEDIFF:

SELECT  Name ,
        StartDate ,
        EndDate ,
        DATEDIFF(YEAR, StartDate, EndDate) AS Duration
FROM    OPENJSON(@Json, '$')
WITH (Name VARCHAR(50), StartDate DATETIME2, EndDate DATETIME2)
WHERE Name = 'bob'

尝试以下解决方案之一(未经测试):

SELECT  s.*, Duration = DATEDIFF(YEAR, StartDate, EndDate)
FROM (
    SELECT  Name ,
            StartDate   = CONVERT(DATE, StartDateChar, 103),
            EndDate     = CONVERT(DATE, EndDateChar, 103)
    FROM    OPENJSON(@Json, '$') WITH (Name VARCHAR(50), StartDateChar VARCHAR(10), EndDateChar VARCHAR(10))
    WHERE   Name = 'bob'
) AS s

SELECT  *, Duration = DATEDIFF(YEAR, StartDate, EndDate)
FROM    OPENJSON(@Json, '$') WITH (Name VARCHAR(50), StartDateChar VARCHAR(10), EndDateChar VARCHAR(10))
CROSS APPLY (
    SELECT          
        StartDate   = CONVERT(DATE, StartDateChar, 103),
        EndDate     = CONVERT(DATE, EndDateChar, 103)
) x
WHERE   Name = 'bob'