首页 > 解决方案 > 在 SQL SERVER 中获取当前学期

问题描述

我在这方面遇到了麻烦,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)

标签: sql-serverbetween

解决方案


假设@ActiveSemester可以取值 0 或 1,我将其写为:

WHERE
b.Shift = 0 and a.eid = 7078 and
YEAR(a.start_date_time) = YEAR(GETDATE()) and a.action_code = 1 
and 
@ActiveSemester = ((MONTH(a.start_date_time)-1)/6)

现在,值得注意的是,这个表达式不能使用索引start_date_time来满足这个最终谓词。如果这是一个问题,并且查询表现不佳,那么我建议在此表中保留计算列以从列中提取年份和月份值start_date_time,修改上述查询以使用这些列并添加适当的索引,填充具有正确表示的此类值(和学期)的日历表并连接到上面的该表,以再次简化表达式并允许使用索引。


另请注意,列名让我担心。如果它确实包含时间部分和日期,请注意原始查询中的表达式将排除在 6 月 30 日午夜和 12 月 31 日1午夜之后发生的任何值。我想这不是你的意图,上面的查询也没有同样的缺点。

1因为2018-06-30T00:01:00严格晚于2018-06-30T00:00:00(这是CAST(CONCAT('06/30/',YEAR(GETDATE())) as date)扩展的),所以不是BETWEEN您给出的开始日期和结束日期。


推荐阅读