Sql server 在SQL查询中添加条件
我想在现有查询中添加一个SQL条件,如果达到以下条件,则返回NULL 我有两列SHIFTA\u START和SHIFTA\u ENDSql server 在SQL查询中添加条件,sql-server,Sql Server,我想在现有查询中添加一个SQL条件,如果达到以下条件,则返回NULL 我有两列SHIFTA\u START和SHIFTA\u END [SHIFTA_START]=员工的计时钟 [SHIFTA_END]=员工的下班时间 例如: 班长开始时间:2016年10月3日下午12:15:00 班主任:2016年10月3日12:30:00 因此,我想对条件进行调整 IF DATEPART SHIFTA_START = DATEPART SHIFTA_END AND SHIFTA_STAR
- [SHIFTA_START]=员工的计时钟
- [SHIFTA_END]=员工的下班时间
- 班长开始时间:2016年10月3日下午12:15:00
- 班主任:2016年10月3日12:30:00
IF DATEPART SHIFTA_START = DATEPART SHIFTA_END
AND SHIFTA_START > SHIFTA_END
THEN return NULL
如何在SQL中编写此代码?非常感谢您的帮助,非常感谢^_^ 使用
大小写表达式
:
SELECT t.*,
CASE WHEN CAST(SHIFTA_START as DATE) = CAST(SHIFTA_END as DATE)
AND SHIFTA_START > SHIFTA_END
THEN NULL
ELSE SomeOtherValue
END as Your_Ind_Column
FROM YourTable
这将导致整个数据集和一个指示列。我不知道只有本专栏会对您有多大帮助,但如果您只想这样做,请从查询中删除t.*
。使用CASE WHEN条件。以下是一个例子:
SELECT
CASE WHEN
DATEPART SHIFTA_START = DATEPART SHIFTA_END
AND SHIFTA_START > SHIFTA_END
THEN
NULL
ELSE
YOUR_COLUMN
END
FROM YOUR_TABLE
如果您想要一个case表达式,那么您希望将日期转换为date,而不是datetime(我想这就是您想要做的) 上述计算将为您提供以下值
- 在同一天开始和结束,但在结束后开始=NULL
- 当天开始和结束,结束前开始(正确)=分钟 在开始和结束之间
- 在不同日期开始和结束=‘不同日期’
declare @test table
(SHIFTA_START datetime NOT NULL,
SHIFTA_END datetime NOT NULL
)
Insert into @test
values('2016-03-10 12:15:00 PM','2016-03-10 12:30:00 AM')
select
CASE WHEN ((datepart(dd,SHIFTA_START) = datepart(dd,SHIFTA_END)) AND (cast(SHIFTA_START as time) > cast(SHIFTA_END as time)))
THEN NULL
ELSE '' END AS RESULT from @test
结果
NULL这永远不会返回结果,请查看WHEN语句its
大小写表达式
,而不是WHEN语句,它当然会返回!因此,这些场都需要彼此相等,并且一个大于另一个。我是在说你的案子的WHEN部分EXPRESSION@RichBenner是的,你是对的,没有看名字。修正。阅读OP的问题,他正在检查shifta_start和shifta_end是否在同一日期,然后他在查找任何轮班结束日期早于开始日期的情况。@sagi我假设OP可能是根据员工的上班时间和下班时间来计算员工的工作时间。但不希望因为数据不正确而出现负值,也希望将结果限制在每天(例如,如果有人不打卡)。在我们的职业生涯中,我们都曾在某个时候处理过糟糕的数据。我知道,我已经在我的回答中对此进行了评论,并修正了我的回答。下面是一些不错的答案。请随时检查它们是否有效,并对任何相关内容进行更新投票。另外,请选择您认为最好的答案作为接受。DeaPosieStavaToLoad在SQL中不起作用,恐怕您需要在这里做一个计算。您需要知道这里的DATEPART计算可能会遇到的问题。如果这两个字段分别在6月1日和7月1日,该怎么办?您最好将datetime转换为date,以避免潜在的问题。
declare @test table
(SHIFTA_START datetime NOT NULL,
SHIFTA_END datetime NOT NULL
)
Insert into @test
values('2016-03-10 12:15:00 PM','2016-03-10 12:30:00 AM')
select
CASE WHEN ((datepart(dd,SHIFTA_START) = datepart(dd,SHIFTA_END)) AND (cast(SHIFTA_START as time) > cast(SHIFTA_END as time)))
THEN NULL
ELSE '' END AS RESULT from @test