sql-server - DATEDIFF SQL Server 2016 JSON

标签 sql-server json tsql sql-server-2016

目前有一个 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 '('.

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

最佳答案

我没有使用过 OPENJSON,但是 WITH 部分不应该包含 Duration 列的定义而不是 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'

或者只在 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'

关于sql-server - DATEDIFF SQL Server 2016 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37614687/

相关文章:

sql - 数据库 : One To Many (or One To None) relationship

mysql - SAS proc sql 更新表,包含计数和最大值

jquery - 从对 Last.FM API 的请求返回的文件中出现错误

javascript - 无法将带有 JSON 对象的变量传递给 for 循环

sql - T-SQL 计算不同年份范围之间的持续时间(以月为单位)

sql-server - 如何在 SQL Server 2008 中创建序列

sql-server - 是否可以为 google SQL 使用自动缩放器,就像计算引擎可以使用自动缩放器一样

javascript - 为什么 onChange 回调中 $scope.data 的更改不会重新绘制 chart.js?

sql - 索引维护

sql 转换为金钱四舍五入