SQL Server 2012,以特定方式生成随机日期

SQL Server 2012,以特定方式生成随机日期,sql,sql-server-2012,Sql,Sql Server 2012,我正在尝试在数据库中创建随机约会 我如何重构这段代码,使StartDate只能有整分钟、半分钟或几分钟,而EndDate在StartDate上增加1小时 我正在使用SQL Server 2012 SELECT (SELECT TOP 1 Id from [dbo].[am_Customer] order by newid()) AS CustomerId -- TODO: StartDate can only be given Who

我正在尝试在数据库中创建随机约会

我如何重构这段代码,使StartDate只能有整分钟、半分钟或几分钟,而EndDate在StartDate上增加1小时

我正在使用SQL Server 2012

 SELECT            
        (SELECT TOP 1 Id from [dbo].[am_Customer] order by newid()) AS CustomerId
          -- TODO: StartDate can only be given Whole, Half or Quartz hours
       ,(SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), getdate())) AS StartDate
          -- TODO: Need to add 1 hour to StartDate
       ,(SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), getdate())) AS EndDate
       ,(SELECT TOP 1 ServiceName from [dbo].[am_Appointments] 
            WHERE DATALENGTH(ServiceName) > 0  order by newid()) AS ServiceName
       ,(SELECT TOP 1 Id from [dbo].[Employees] order by newid()) AS EmployeeId
编辑: 以下是我最终得出的解决方案:

;WITH s AS (
    SELECT
        DATEADD(minute, ABS(CHECKSUM(NEWID()) % 350400)*15,
        DATEADD(day,DATEDIFF(day,0,getdate()),0)) AS StartDate
)

SELECT            
        (SELECT TOP 1 Id FROM [dbo].[am_Customer] ORDER BY newid()) AS CustomerId
       ,(SELECT s.StartDate)  AS StartDate
       ,(SELECT DATEADD(hour,1,s.StartDate)) AS EndDate
       ,(SELECT TOP 1 ServiceName from [dbo].[am_Appointments] WHERE DATALENGTH(ServiceName) > 0  ORDER BY newid()) AS ServiceName
       ,(SELECT TOP 1 Id FROM [dbo].[Employees] ORDER BY newid()) AS EmployeeId


FROM s

使用交叉应用计算开始日期,然后该计算可以由其别名引用以计算结束日期,如下所示:

|                       STARTDATE |                        COLUMN_1 |
|---------------------------------|---------------------------------|
| February, 25 2020 10:30:00+0000 | February, 25 2020 11:30:00+0000 |
|     July, 08 2018 18:15:00+0000 |     July, 08 2018 19:15:00+0000 |
制作人

SELECT
      ca1.StartDate
    , dateadd(hour,1,ca1.StartDate) 

from supportContacts --<< any table

CROSS APPLY (select
             dateadd(minute,ABS(CHECKSUM(NEWID()) % 3650) * 15 ,DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), dateadd(dd, datediff(dd,0, getDate()), 0)))  
             ) as ca1 (StartDate)
选择
起始日期
,日期添加(小时,1,ca1.开始日期)

从supportContacts--中,这将在未来10年的某个时间生成一个间隔为15分钟的
StartDate
值,并在一小时后生成一个
EndDate

;With s as (
    SELECT
        DATEADD(minute, ABS(CHECKSUM(NEWID()) % 350400)*15,
        DATEADD(day,DATEDIFF(day,0,getdate()),0)) as StartDate
)
select s.StartDate,DATEADD(hour,1,s.StartDate) as EndDate
from s

这(很小)有可能产生一个
StartDate
,该日期在今天和现在之前。如果您想避免这种情况,简单的解决方法是将
DATEADD(day,DATEDIFF(day,0,getdate()),0)中的第二个
0
更改为
1
,这样它就不会在今天的日期生成任何值。

Quartz=Quater?所以只有60分钟、30分钟或15分钟的间隔时间-对吗?这是正确的@被Alreadygood用过看你尝试-成功的回答,这正是我想要的。但是我的SQL不是很好,所以我不能在不丢失其他表的情况下实现它。您能告诉我如何将ServiceName select添加到此查询中吗?假设您现有的查询(如问题中所示)将其放在CTE下,并使用…替换现有的startdate和enddate计算,使用解决方案中提供的计算…这并不难-尝试一下