小编use*_*415的帖子

使用营业时间和假期计算到期日

我需要计算SLA的到期日期/结束日期.作为输入值,我有开始日期和时间跨度(以分钟为单位).此计算需要考虑营业时间,周末和假期.

我已经看到很多例子,其中输入是开始日期和结束日期,但是一直在努力寻找与上述输入值类似的东西.

这个问题有优雅的解决方案吗?有没有办法在不使用循环的情况下计算到期日期?如果不做类似以下可怕算法的事情,我想不出一种方法来进行计算:

  1. 创建一个返回变量"截止日期"并将其设置为输入变量"开始日期"
  2. 创建一个控制变量"used minutes"并将其设置为0
  3. 创建一个条件为"used minutes"<="input timespan"的循环
  4. 在循环内部,向"到期日期"返回变量添加第二个
  5. 在循环内部,检查第二个是否在运行的几小时内(检查营业时间,周末和假日).如果是这样,将控制变量"used minutes"增加1.
  6. 退出循环后,返回变量"截止日期"

sql sql-server-2005

7
推荐指数
1
解决办法
3020
查看次数

"IN"命令的AND逻辑运算符对应?

假设我有两张桌子:

  • 雇员
  • EmpLocXref

如果我想列出属于位置1,2 3的员工,我会编写类似于以下内容的查询:

SELECT DISTINCT e.id, e.name
FROM Employee e
JOIN EmpLocXref x ON x.employee_id = e.id
WHERE x.location_id IN (1, 2, 3)
;
Run Code Online (Sandbox Code Playgroud)

例子.

但是,如果我想列出仅属于1,2 3 位置的员工呢?我意识到我可以写类似的东西:

SELECT e.id, e.name
FROM Employee e
JOIN EmpLocXref x ON x.employee_id = e.id
WHERE x.location_id IN (1, 2, 3)
GROUP BY e.id, e.name
HAVING COUNT(*) = 3
;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,不包括动态SQL?

编辑:修复了第二次查询的derp时刻.添加了Fiddler示例.

sql

6
推荐指数
1
解决办法
80
查看次数

随机聚合?

我正在使用Microsoft的SQL Server 2008.我需要通过外键聚合来随机获取单个值,但我很难过.请考虑下表:

id          fk          val
----------- ----------- ----
1           100         abc
2           101         def
3           102         ghi
4           102         jkl
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

fk          val
----------- ----
100         abc
101         def
102         ghi
Run Code Online (Sandbox Code Playgroud)

其中fk 102的val随机地是"ghi"或"jkl".

我尝试使用NEWID()来获取唯一的随机值,但是,由于NEWID()值因子查询而异,因此JOIN失败.

WITH withTable AS (
    SELECT id, fk, val, CAST(NEWID() AS CHAR(36)) random
    FROM exampleTable
)
SELECT t1.fk, t1.val
FROM withTable t1
JOIN (
    SELECT fk, MAX(random) random
    FROM withTable
    GROUP BY fk
) t2 ON t2.random = t1.random
;
Run Code Online (Sandbox Code Playgroud)

我很难过.任何想法将不胜感激.

sql t-sql sql-server-2008

5
推荐指数
1
解决办法
640
查看次数

如何在wcf rest服务中添加全局错误处理

在我的Web应用程序中,我使用global.asax中的Application_Error函数来记录所有异常,如下所示:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    while (ex.GetBaseException() != null)
    {
        ex = ex.GetBaseException();
    }

    log.writeError(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我在WCF REST服务中尝试过类似的运气而没有运气.我如何添加全局错误处理?我看过这篇文章,但我是实现IServiceBehavior的新手.我在哪里添加上面的代码?

rest wcf

3
推荐指数
1
解决办法
2563
查看次数

带动态WHERE列的参数化SQL

我正在尝试编写简单的过滤,用户可以在其中输入要过滤的列和值.棘手的部分是动态选择要过滤的列.

我在网上找到了几个解决方案,我不确定要实施哪些解决方案.我倾向于倾向于性能而不是可维护性.任何意见将不胜感激.

假设我有一个表"t",它有5个VARCHAR列:"c1","c2","c3","c4"和"c5".

解决方案1 ​​ - 简单方法

我可以使用动态SQL.有点像:

DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM t WHERE ' + @columnName + ' = ''' + @columnValue + ''';'
EXEC (@sql);
Run Code Online (Sandbox Code Playgroud)

会出现类似的结果:

SELECT *
FROM t
WHERE c1 = 'asdf'
;
Run Code Online (Sandbox Code Playgroud)

出于以下两个原因,我不想使用此解决方案.在走下兔子洞之前,我主要将此作为一个简单的参考点.

  1. 它不防止SQL注入.
  2. 即使我要参数化columnValue,我也会为5列中的每一列缓存5个不同的执行计划,因为你无法参数化@columnName.

解决方案2 - 或者是

可以使用只有两个参数的一系列OR.所以我们说:

@columnName = 'c1'
@columnValue = 'asdf'
Run Code Online (Sandbox Code Playgroud)

然后SQL将成为:

SELECT *
FROM t
WHERE (@columnName = 'c1' AND c1 = @columnValue)
  OR (@columnName = 'c2' AND c2 = @columnValue)
  OR (@columnName = 'c3' AND c3 …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2012

3
推荐指数
1
解决办法
139
查看次数