sql-server - 在 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)
解决方案
假设@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
您给出的开始日期和结束日期。
推荐阅读
- microservices - 启动其他微服务的微服务
- ios - 图像 I/O 错误:“addImageFromSource:2179:源的图像 0 为零”
- angular - 在 Angular 数据表中单击按钮获取行数据
- bash - 需要在我的 android 设备上查找已安装 apk 的版本
- android - 将自定义行添加到联系人详细信息,仅适用于一个联系人
- laravel - Laravel 不向数据库中的随机用户发送邮件
- c# - 两个项目和同一用户 ASP.NET MVC5 中的 SSO 身份验证
- ruby-on-rails - Mysql2::Error: 超过锁定等待超时;尝试重新启动事务:SELECT `rpush_notifications`.`id` FROM `rpush_notifications`
- maven - IntelliJ IDEA - Maven2 - 安装
- azure - 如何从 azure 本地调用脚本 powershell?