SQL Query将日期时间设置为午夜过后并从中删除一天

时间:2016-11-01 17:20:19

标签: sql sql-server sql-server-2012

我正在处理涉及员工工作时间的存储过程。我有一个由员工日志组成的数据库,其中包含类似于以下内容的内容:

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函数。

此时将非常感谢任何帮助或指导。谢谢

4 个答案:

答案 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()