Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取SQL SERVER中的当前学期_Sql Server_Between - Fatal编程技术网

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
是一个表达式。它返回一个标量值(每行)。它不是某种形式的控制流,可以以某种方式嵌入到其他语句中。