Sql server 获取SQL SERVER中的当前学期
我在这个Sql server 获取SQL SERVER中的当前学期,sql-server,between,Sql Server,Between,我在这个查询中遇到了一个问题,它在关键字'BETWEEN'附近说语法不正确,但是当我试图在没有的情况下单独执行BETWEEN条件时,正常运行,并且与标题相关,在SQL SERVER中获取学期的正确方法是什么 DECLARE @ActiveSemester INT SET @ActiveSemester = ISNULL((SELECT [value] FROM spms_tblProfileDefaults WHERE eid = 7078 and ps_id = 1), (SELECT [v
查询中遇到了一个问题,它在关键字'BETWEEN'
附近说语法不正确,但是当我试图在没有的情况下单独执行BETWEEN
条件时,
正常运行,并且与标题相关,在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)
假设@ActiveSerm
可以接受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\u date\u time
上的索引来满足这个最终谓词如果这是一个问题,并且查询执行得不好,那么我建议在此表中保留计算列,从start\u date\u 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)的内容)
扩展到)你给出的开始日期和结束日期之间的也不一样。另一个答案似乎被删除了,下面是我所做的,正如其他人指出的,在
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)
有了这个,我得到了我想要的结果。谢谢您可以用以下行替换WHERE
子句中的CASE
语句:(@activeserm=1和a.start_date_CAST之间的时间(CONCAT('01/01/'),YEAR(GETDATE()))和CAST(CONCAT('06/30/',YEAR(GETDATE()))
出于某种原因,人们开始在SQL中使用CASE
,而实际上他们只需要使用简单的布尔运算符。CASE
是一个表达式。它返回一个标量值(每行)。它不是某种形式的控制流,可以以某种方式嵌入到其他语句中。