Sql server DATEDIFF SQL Server 2016 JSON

Sql server DATEDIFF SQL Server 2016 JSON,sql-server,json,tsql,sql-server-2016,Sql Server,Json,Tsql,Sql Server 2016,目前有一个用JSON格式化的startDate和EndDate,并尝试使用DATEDIFF函数使用OPENJSON计算年份差异 我目前正在尝试下面的方法 DECLARE @Json VARCHAR(4000) = ' { "Name": "bob", "StartDate": "12/02/2015", "EndDate": "12/02/2016" }'; SELECT Name , StartDate , EndDate FROM O

目前有一个用JSON格式化的startDate和EndDate,并尝试使用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'
但是,我收到错误消息:

味精102,第15级,状态1,第15行
“(”附近的语法不正确


有人知道我是否可以做我正在做的事情吗?或者提出另一种方法吗?我希望避免创建一个临时表,插入到其中,然后用select上的DATEDIFF从中读取(如果可能)。

我没有使用
OPENJSON
,但是
with
部分不应该包含
持续时间的定义吗与
DATEDIFF
相对的列,然后将
DATEDIFF
移动到
SELECT
。如下所示:

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'
或者只需在
选择中执行
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'

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


您可以使用派生表,即别名为的子查询。bob姓什么?@Robert Stanley-Wiley。Bobs姓Wiley。非常感谢。将DATEDIFF移动到select完成了工作。尝试此操作时,我将日期格式保留在DATEDIFF中。在回答的第一个示例中,with子句中的Duration列无效。它将尝试JSON中的nd Duration键,它将始终返回NULL,因为它不存在。可能您应该只留下第二个示例。此外,您不需要OPENJSON中的第二个参数“$”(@JSON,$)$是默认值,因此您可以只使用OPENJSON(@JSON)@JocaPC感谢您在OPENJSON的默认值上指出这一点。我想我在实际使用的示例中留下了这一点,而不是我制作的快速模型。
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'