【问题标题】:Random Time Distribution using SQL Server使用 SQL Server 的随机时间分布
【发布时间】:2023-03-04 21:47:01
【问题描述】:

我在 SQL Server 中有一个表(当前数据)

EmpId 1001 在 2020 年 1 月的总时间为 3 小时 24 分钟

我想在 1-jan-20 到 31-jan-20 之间随机分配/添加 3 小时 24 分钟到 OutTime 列

(预期结果)

有 200 多名员工,不同的员工有不同的时间数据(存储在另一个表中) 如何编写查询以更新加班员工的 OutTime

【问题讨论】:

  • 如果您能向我们展示您当前的查询,那就太好了。还请解释你想如何randomly 分配3hrs 24 min 的超时时间。规则是什么?
  • 能把你有的ddl和dml贴出来
  • 实际上有 2 个表,其中第一个表包含 EmpId、PunchDate、InTime、OutTime(如第一张图所示),而第二个表包含 2 个列,即 EmpId 和 OverTime。我想更新第一个表中的 OutTime。例如员工 1001 有 3 小时 24 分钟。我想将此时间添加到 outTime 但不是在一天,它应该是任何随机天和随机小时/分钟。所以最后总共需要 3 小时 24 分钟才能完成分发。 (如第二张图片)如果我们比较上面的第一张和第二张图片,有3小时24分钟黄色突出显示的差异。我想写一个查询来做到这一点。

标签: c# sql sql-server asp.net-mvc


【解决方案1】:

我为您的问题编写此代码 此代码适用于一名员工,您可以使用一个光标或同时为所有员工扩展此代码。

此选择用于将样本数据生成到临时表中

SELECT *
INTO #DATA
FROM (
VALUES
(1001,'2020-01-01','09:14' , '06:45'),
(1001,'2020-01-02','08:20' , '06:15'),
(1001,'2020-01-03','07:14' , '06:20'),
(1001,'2020-01-04','09:30' , '07:00'),
(1001,'2020-01-05','09:20' , '06:30'),
(1001,'2020-01-06','09:14' , '06:40'),
(1001,'2020-01-07','08:45' , '06:10'),
(1001,'2020-01-08','08:30' , '07:45'),
(1001,'2020-01-09','08:14' , '07:15')
) AS F(EMPID , PURCHDATE,INTIME,OUTETIME)


-- the time must be add in random value is 3:24
DECLARE @AddedTime TIME = '3:24'

使用此代码将您的时间转换为分钟,因为如果您有秒,您将在此代码中添加大约秒,并将所有分钟日期部分更改为秒

DECLARE @AddedTimeAsMinute INT = DATEPART(HOUR , @AddedTime) * 60 + DATEPART(MINUTE , @AddedTime)
---------------------------------------------------------
PRINT @AddedMinute
---------------------------------------------------------

这部分用于获取最小和最大日期,并在它们之间选择一个随机日期。

DECLARE @DiffDate INT
DECLARE @StartDate DATE = '2020-01-01',@EndDate DATE = '2020-01-09'
SELECT @DiffDate = DATEDIFF(DAY,@StartDate ,@EndDate )

之后,您可以随机选择一天,并在超时时添加随机分钟

WHILE @AddedTimeAsMinute > 0
BEGIN

    DECLARE @AddMinute INT= (SELECT FLOOR(RAND()*(@AddedTimeAsMinute - 1))+1)

    SELECT *,CAST(DATEADD(MINUTE,@AddMinute,OUTETIME) AS TIME) NEWTIME
    FROM  #DATA 
    WHERE DAY(PURCHDATE) = FLOOR(RAND()*(@DiffDate - 1 + 1)) +1
    AND EMPID = 1001

    SET @AddedTimeAsMinute = @AddedTimeAsMinute - @AddMinute

END
DROP TABLE #DATA

您可以将 while 循环的核心放入任何员工数据的游标中

【讨论】:

  • 太棒了!这正是我正在寻找的。有效!接受这个答案。谢谢你。只是要知道,一个额外的东西,我们能不能只生成能被 5 整除的数字。这条线 DECLARE @AddMinute INT= (SELECT FLOOR(RAND()*(@AddedTimeAsMinute - 1))+1) 我的意思是,分钟像 30、55、25、20....
  • @shravanbardwa 如果你喜欢我的回答,请点击赞你。您可以使用此代码 DECLARE @AddedTimeAsMinute INT = 204 DECLARE @AddMinute INT= (SELECT FLOOR(RAND()*(@AddedTimeAsMinute - 1))+1) WHILE @AddMinute % 5 <> 0 BEGIN SET @AddMinute = (SELECT FLOOR(RAND()*(@AddedTimeAsMinute - 1))+1) END PRINT @AddMinute 更改部分代码
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2014-08-04
  • 2014-11-10
  • 1970-01-01
  • 2017-04-24
  • 2023-03-26
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多