根据小时值SQL Server计算费率

时间:2015-10-21 03:59:05

标签: sql sql-server tsql

在我们的应用程序中,我们遵循以下模式以节省员工花费的时间。

  • 30分钟= 0.30
  • 1小时= 1

因此,如果员工工作1小时30分钟,则小时值将为1.30.

我们还使用以下公式计算每位员工的工资。

wages = rate * hours  

如果员工的小时费率为50$,则他的工资为1小时30分钟75$。但根据我们的数据结构,我们得到了

wages = 50 * 1.30 = 65    

我怎样才能得到正确的工资?

(注意:我们不允许更改表中的数据结构。即将1小时30分钟改为1.50)

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

以下是如何将您的号码转换为小时数的示例,您可以将其乘以工资。

library(lpSolve)

optim <- function(df, r) {
  # Some book keeping
  nodes = c(df$nodeA, df$nodeB)
  u.nodes <- unique(nodes)
  if (!r %in% u.nodes) {
    stop("Invalid root node provided")
  }
  n.node <- length(u.nodes)
  attrs = c(df$attributeA, df$attributeB)
  node.attrs <- do.call(rbind, lapply(u.nodes, function(x) {
    data.frame(node=x, attr=unique(attrs[nodes == x]))
  }))
  n.na <- nrow(node.attrs)
  n.e <- nrow(df)

  # Constraints limiting each node to have exactly one attribute
  node.one.attr <- t(sapply(u.nodes, function(i) {
    c(node.attrs$node == i, rep(0, 2*n.e))
  }))
  node.one.attr.dir <- rep("==", n.node)
  node.one.attr.rhs <- rep(1, n.node)

  # Constraints limiting edges to only be used if both attributes are selected
  edge.flow <- do.call(rbind, lapply(seq_len(n.e), function(idx) {
    i <- df$nodeA[idx]
    j <- df$nodeB[idx]
    a <- df$attributeA[idx]
    b <- df$attributeB[idx]
    na.i <- node.attrs$node == i & node.attrs$attr == a
    na.j <- node.attrs$node == j & node.attrs$attr == b
    rbind(c(-n.node*na.i, seq_len(n.e) == idx, -(seq_len(n.e) == idx)),
          c(-n.node*na.j, seq_len(n.e) == idx, -(seq_len(n.e) == idx)),
          c(n.node*na.i, seq_len(n.e) == idx, -(seq_len(n.e) == idx)),
          c(n.node*na.j, seq_len(n.e) == idx, -(seq_len(n.e) == idx)))
  }))
  edge.flow.dir <- rep(c("<=", "<=", ">=", ">="), n.e)
  edge.flow.rhs <- rep(0, 4*n.e)

  # Constraints limiting net flow on non-root nodes
  net.flow <- do.call(rbind, lapply(u.nodes, function(i) {
    if (i == r) {
      return(NULL)
    }
    rbind(c(rep(0, n.na), (df$nodeB == i) - (df$nodeA == i),
          -(df$nodeB == i) + (df$nodeA == i)),
          c(rep(0, n.na), (df$nodeB == i) - (df$nodeA == i),
          -(df$nodeB == i) + (df$nodeA == i)))
  }))
  net.flow.dir <- rep(c(">=", "<="), n.node-1)
  net.flow.rhs <- rep(c(0, 1), n.node-1)

  # Build the model
  mod <- lp(direction = "max",
            objective.in = c(rep(0, n.na), (df$nodeA == r) - (df$nodeB == r),
                             -(df$nodeA == r) + (df$nodeB == r)),
            const.mat = rbind(node.one.attr, edge.flow, net.flow),
            const.dir = c(node.one.attr.dir, edge.flow.dir, net.flow.dir),
            const.rhs = c(node.one.attr.rhs, edge.flow.rhs, net.flow.rhs),
            binary.vec = seq_len(n.na))
  opt <- node.attrs[mod$solution[1:n.na] > 0.999,]
  valid.edges <- df[opt$attr[match(df$nodeA, opt$node)] == df$attributeA &
                    opt$attr[match(df$nodeB, opt$node)] == df$attributeB,]
  list(attrs = opt,
       edges = valid.edges,
       objval = mod$objval)
}

答案 1 :(得分:1)

    cast(substring('1.30',charindex('.','1.30')+1,len('1.30')) as float)/60

答案 2 :(得分:1)

你可以试试这个:

DECLARE @col FLOAT
SET @col = 1.30

DECLARE @hours FLOAT
SET @hours = (SELECT FLOOR(@col) + (@col - FLOOR(@col))/0.6)

然后wages = rate * @hours

答案 3 :(得分:1)

DECLARE @Hours DECIMAL(18,2)
DECLARE @Rate MONEY
SET @Rate = 50
SET  @Hours = 1.3
SELECT (CAST(@Hours AS INT) + (@Hours - CAST(@Hours AS INT))/.6)*@Rate