【问题标题】:Append random timestamps to a date field while subtracting days from todays date?将随机时间戳附加到日期字段,同时从今天的日期中减去天数?
【发布时间】:2021-02-03 18:58:10
【问题描述】:

以下 SQL 使用getdate() 选择今天的日期并附加一个随机时间戳:

SELECT
   DATEADD(SECOND ,RAND(CHECKSUM(NEWID())) * 86400,CONVERT(datetime,CONVERT(varchar(8),GETDATE(),112))) 
   AS DUEDATE
FROM [dbo].[Table] as t

生产

2021-02-03 21:11:21.000
2021-02-03 15:51:06.000
2021-02-03 14:08:24.000
2021-02-03 16:10:50.000
2021-02-03 02:56:00.000

此 SQL 使用 getdate() 获取今天的日期并从 t.daysago 中减去该值(例如 1、2、3、4、5 等)以生成过去的日期(例如,今天的日期 - 5天)

select 
(Dateadd(day, -t.daysago, Getdate()))   
FROM [dbo].[Table] as t

生成这些降序日期,但在每一行中具有相同的时间戳。

2021-02-02 12:38:09.133
2021-02-01 12:38:09.133
2021-01-30 12:38:09.133
2021-01-29 12:38:09.133
2021-01-28 12:38:09.133

我需要更改时间戳,以便我的演示仪表板中的数据看起来真实。

我正在尝试将这两种方法结合起来,但遇到了麻烦。我想用getdate() 生成今天的日期,然后从今天的日期中减去t.daysago 中的值,然后随机化时间戳。

如果今天的日期和当前时间是 2021-02-03 22:11:31.000,我想生成以下内容(通过减去 t.daysago (1,2,3,4,5) 中的值:

2021-02-02 22:11:31.000
2021-02-01 15:51:06.000
2021-01-30 14:08:24.000
2021-01-29 16:10:50.000
2021-01-28 02:56:00.000

我似乎无法弄清楚如何组合这些方法来获得所需的输出。有什么建议吗?

【问题讨论】:

  • 向我们展示您尝试将它们结合起来的尝试。
  • 它很丑但是:选择 DATEADD(SECOND ,RAND( CHECKSUM(NEWID())) * 86400, CONVERT(Datetime(day, -ts.daysago, Getdate()) ) AS DueDate FROM [ dbo].[TaskSummary] as ts
  • edit 它进入您的问题。并解释什么不起作用。
  • 将尝试。它甚至还没有接近工作。

标签: sql sql-server tsql


【解决方案1】:

您仍然可以使用上述逻辑并进行一些更改,您可以选择SECOND 或将number 参数用于 DATEADD 以获得更紧密或更宽的范围:

SELECT
   DATEADD(MILLISECOND ,CHECKSUM(NEWID()) ,GETDATE())    AS DUEDATE
FROM [dbo].[Table] as t

例如,如果您想控制范围,例如从特定日期开始的 5 天范围内的日期:

你可以声明@startdate 你想要什么

DECLARE @dayrange int = 5

SELECT
   DATEADD(SECOND ,RAND(CHECKSUM(NEWID())) * 86400,CONVERT(datetime,CONVERT(varchar(8),DATEADD(DAY, - t.daysago ,GETDATE(),112))) 
   AS DUEDATE
FROM [dbo].[Table] as t

【讨论】:

  • 我需要用“getdate() -t.daysago”替换 @dayrange 逻辑。正在尝试。
  • 这不是很有效DATEADD(SECOND ,RAND(CHECKSUM(NEWID())) * 86400 * -t.daysago + 3,CONVERT(datetime,CONVERT(varchar(8),GETDATE(),112))) AS DueDate,,因为它产生随机日期似乎2021-01-27 19:06:01.000 2021-02-02 02:04:39.000 2021-02-02 10:53:21.000 2021-01-14 00:43:07.000 2021-01-14 10:48:51.000
  • 是的。我正在处理这个问题。我需要使用 t.daysago 列中的值并减去 getdate() 而不是 @StartDate。感谢您的帮助。
  • 我得到了他的错误:Msg 102, Level 15, State 1, Line 131 Incorrect syntax near 'days'. 我尝试每天更改但也不喜欢。
  • 放弃天数可能已经解决了这个问题。现在测试。 DATEADD(SECOND ,RAND(CHECKSUM(NEWID())) * 86400,CONVERT(datetime,CONVERT(varchar(8),GETDATE(),112)) -ts.daysago)
【解决方案2】:

您可以使用rand() 来添加一些随机时间,如下所示:

select 
    (Dateadd(day, -t.daysago, dateadd(minute,round(rand()*rand()*25,0),Getdate())))   
FROM [dbo].[Table] as t

【讨论】:

  • 这不是随机化时间戳,。试图弄清楚它,因为它看起来很接近。输出为2021-01-17 13:25:17.327 2021-01-18 13:25:17.327 2021-01-19 13:25:17.327 2021-01-20 13:25:17.327 2021-01-21 13:25:17.327
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
相关资源
最近更新 更多