我在这个query上遇到了麻烦,它写着Incorrect syntax near the keyword 'BETWEEN',但当我试图在没有BETWEEN的情况下单独执行CASE WHEN条件时,它运行正常,也与标题有关,是不是在SQL SERVER中获取学期的合适方式?
DECLARE @ActiveSemester INT
SET @ActiveSemester = ISNULL((SELECT [value]
FROM spms_tblProfileDefaults WHERE eid = 7078 and ps_id = 1), (SELECT [value]
FROM spms_configs WHERE actions = 'semester_active') )
SELECT FORMAT((SUM((DATEDIFF(MINUTE, a.actual_start_time, a.actual_end_time)
- isnull(datediff(minute, break_start, break_end), 0))/ 60.0)), '0.00')
FROM spms_tblSubTask as a
LEFT JOIN pmis.dbo.employee as b ON a.eid = b.eid
LEFT JOIN pmis.dbo.time_reference as c ON c.code = ISNULL(b.TimeReference, 'TIME14')
LEFT JOIN dbo.spms_vwOrganizationalChart as e ON a.eid = e.eid
cross apply
(
select break_start = case when c.break_from between a.actual_start_time and a.actual_end_time
then c.break_from
when a.actual_start_time between c.break_from and c.break_to
then a.actual_start_time
else NULL
end,
break_end = case when c.break_to between a.actual_start_time and a.actual_end_time
then c.break_to
when a.actual_end_time between c.break_from and c.break_to
then a.actual_end_time
end
) as d
WHERE
b.Shift = 0 and a.eid = 7078 and
YEAR(a.start_date_time) = YEAR(GETDATE()) and a.action_code = 1
and
(CASE
WHEN
@ActiveSemester = 1
THEN
a.start_date_time BETWEEN CAST(CONCAT('01/01/',YEAR(GETDATE())) as date) AND
CAST(CONCAT('06/30/',YEAR(GETDATE())) as date)
ELSE
a.start_date_time BETWEEN CAST(CONCAT('07/01/',YEAR(GETDATE())) as date) AND
CAST(CONCAT('12/31/',YEAR(GETDATE())) as date)
END)发布于 2018-07-17 15:39:32
似乎另一个答案被删除了,下面是我所做的,因为另一个答案指出了CASE的正确用法
WHERE
'other condition' and
a.start_date_time BETWEEN
(CASE
WHEN @ActiveSemester = '1'
THEN
CAST(CONCAT('01/01/',YEAR(GETDATE())) as date)
ELSE
CAST(CONCAT('07/01/',YEAR(GETDATE())) as date)
END)
AND
(CASE
WHEN @ActiveSemester = '1'
THEN
CAST(CONCAT('06/30/',YEAR(GETDATE())) as date)
ELSE
CAST(CONCAT('12/31/',YEAR(GETDATE())) as date)
END)这样,我就得到了我想要的结果。谢谢
https://stackoverflow.com/questions/51375485
复制相似问题