我正在处理涉及员工工作时间的存储过程。我有一个由员工日志组成的数据库,其中包含类似于以下内容的内容:
Emp ID Event Time
xxxxx Log In 9/1/2016 8:00 PM
xxxxx Start Driving 9/1/2016 8:15 PM
xxxxx Load 9/1/2016 10:30 PM
xxxxx Driving 9/1/2016 11:00 PM
xxxxx Unload 9/2/2016 1:00 AM
xxxxx Driving 9/2/2016 1:30 AM
xxxxx Log Out 9/2/2016 4:00 AM
我要做的是将此数据插入到另一个表中,其中包含一个Shift Date列,该列将检查午夜过去的时间并为其指定前一天的值,以便整个班次将有1个班次日期。 / p>
这是我尝试用来提取日期的存储过程
Convert(date,
IIf(dr.[Terminal Name] Like '*PM Drivers*',
--true condition statement for first IIF
IIF(datepart(hour,
--datepart value
IIF(pn.effective_dt_local IS NOT NULL, pn.effective_dt_local,
IIF(pn.settings<>'',DateAdd(hour,5,pn.effective_datetime),pn.effective_datetime)))<10,
--true condition for second
IIF dateadd(day,-1,IIF(pn.effective_dt_local IS NOT NULL, pn.effective_dt_local,
IIF(pn.settings<>'',DateAdd(hour,-5,pn.effective_datetime),pn.effective_datetime))),
--false condition for second IIF
IIF(pn.effective_dt_local IS NOT NULL, pn.effective_dt_local,
IIF(pn.settings<>'',DateAdd(hour,-5,pn.effective_datetime),pn.effective_datetime))),
--false condition for second IIF
IIF(pn.effective_dt_local IS NOT NULL, pn.effective_dt_local,
IIF(pn.settings<>'',DateAdd(hour,-5,pn.effective_datetime),pn.effective_datetime))))
我得到的问题是,午夜之后的日期永远不会被调整。我相当肯定这是一个简单的我想念但似乎无法弄明白。我能够使用相同的逻辑在访问中获得类似的查询,但Access具有sqlserver不具有的datevalue函数。
此时将非常感谢任何帮助或指导。谢谢
答案 0 :(得分:0)
使用此选项匹配登录和注销
declare @temp table (Emp_id int, [Event] varchar(50), Time datetime);
insert into @temp values (1, 'Log In', '9/1/2016 8:00pm')
insert into @temp values (1, 'Log Out', '9/2/2016 4:00AM')
insert into @temp values (1, 'Log In', '9/2/2016 8:00pm')
insert into @temp values (1, 'Log Out', '9/3/2016 4:00AM')
;with logs as
(
select
Emp_ID,
[Event],
[Time],
row_number() over (Partition by Emp_ID order by Emp_ID) as Ord
from @temp
where [Event] in ('Log In', 'Log Out')
)
select
li.Emp_ID,
li.[Time],
datediff(mi, li.time, lo.time) / 60.0
from
(
select
*
from logs
where Event = 'Log In'
) li
inner join
(
select
*
from logs
where Event = 'Log Out'
) lo
on li.Emp_id = lo.Emp_id
and lo.ord = li.ord + 1
答案 1 :(得分:0)
您可以从该日期起6个小时并将其转换为日期,任何时间在上午6点之前的任何时间都可以在此之后的任何时间保留在同一天。
var _ = require('lodash');
var DocumentRow = Backbone.View.extend({
events: {
"click #someEl": "open"
},
clean: function() {
// cleans up event bindings to prevent memory leaks
},
initialize: function(options) {
_.bindAll(this, [
'initialize',
'open',
'render',
'clean'
]);
options = options || {};
this.collection = options.collection ? options.collection : SomeCollection;
this.listenTo(this.collection, "reset", this.render);
},
open: function(item) {
...
},
render: function() {
...
}
});
答案 2 :(得分:0)
所以我是一个白痴,在我喜欢的声明中使用了错误的通配符。应该使用%
而不是*
所以最初的声明应该是
Like '%PM Drivers%'
不是Like '*PM Drivers*',
答案 3 :(得分:0)
这是2008 R2之前的一种方法。通过包含// NOTE: Replace this with your actual RSA public/private keypair!
var provider = new RSACryptoServiceProvider(2048);
var parameters = provider.ExportParameters(true);
// Build the credentials used to sign the JWT
var signingKey = new RsaSecurityKey(parameters); //not an option for me, unfortunately
和LEAD()
窗口函数,解决方案可以减少到1/3的大小。
LAG()