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
然后移动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'
尝试以下解决方案之一(未经测试):
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'
目前有一个 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
然后移动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'
尝试以下解决方案之一(未经测试):
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'