1

我正在使用 SQL Server 2008。

我得到了一张包含这 5 列的表格:

StartMonth, StartYear, EndMonth, EndYear, DaysBetween

我没有这些日期的日期,这就是我想要生成的。

例如:

12     2008  1  2009         8

我想创建一个随机日期(开始日期和结束日期,格式为 dd/mm/yyyy),它将包括日期,并将根据我在几天之间的数据制作场景

例如,如果我知道我有 8 天 ( DaysBetween) 并且startmonth是 12,那么日期必须 从 24/12/2008 开始,因为如果我加上 8 天,我会得到EndMonth(1/2009)

如果我选择日期 2/12/2008,我会得到 10/12/2008,这不好,因为该月仍然是 12.... 我需要 1 (2009)

如何生成有效日期?

4

3 回答 3

0

你需要零件来解决这个问题:

  1. 创建一个介于 1 和DaysBetween
  2. 使用 DateAdd 函数选择下个月第一天前 X 天的日期(X 是前一部分的值)。

要创建随机值,请尝试以下操作:

SELECT Cast((  DAYSBETWEEN   ) * Rand(Cast(Newid() AS VARBINARY)) + 1 
            AS 
                   TINYINT) AS 'randomNumber' 
FROM   TABLE 

然后添加 dateadd 函数:

SELECT Dateadd(DD, Cast(( DAYSBETWEEN  ) * Rand(Cast(Newid() AS 
                                                                VARBINARY)) 
                               + 1 AS 
                                           TINYINT), Dateadd(MONTH, 1, 
                                                     Cast( 
              Cast(STARTMONT AS VARCHAR(2)) + '-01-' 
              + Cast(@StartYear AS VARCHAR(4)) AS DATE))) 
FROM   TABLE 
于 2013-08-01T07:49:58.633 回答
0

这是一个示例:

WITH CTE_Start AS 
(
   SELECT DATEADD(dd,-(ABS(CHECKSUM(NewId())) % DaysBetween+1),dateadd(mm, (EndYear - 1900) * 12 + EndMonth - 1,0)) StartDate, DaysBetween
   FROM dbo.This5Columns
)
SELECT StartDate, DATEADD(dd,DaysBetween,StartDate) AS EndDate
FROM CTE_Start

ABS(CHECKSUM(NewId())) % DaysBetween+1 用于获取 1 到 DaysBetween 之间的随机天数,

dateadd(mm, (EndYear - 1900) * 12 + EndMonth - 1,0) 获取结束月份的第一个日期(可能的最早结束日期)

然后你减去这两个得到你的 StartDate,并再次添加 DaysBetween 得到 EndDate

SQLFiddle 演示

于 2013-08-01T08:07:09.000 回答
0

像这样的东西?

WITH N(n) AS (
    SELECT a*6+b FROM
    (VALUES(0),(1),(2),(3),(4),(5))a(a),
    (VALUES(1),(2),(3),(4),(5),(6))b(b)
), T(StartMonth,StartYear,EndMonth,EndYear,DaysBetween) AS (
    SELECT 12, 2008, 1, 2009, 8
)

SELECT *
FROM (
    SELECT *, DATEADD (dd, -n, DATEADD (mm, StartMonth, DATEADD (yy, StartYear - 1900, '19000101'))) AS dt
    FROM T
    INNER JOIN N ON DaysBetween >= n
) T
WHERE MONTH (dt) = StartMonth
    AND YEAR (dt) = StartYear
    AND MONTH (DATEADD (dd, DaysBetween, dt)) = EndMonth
    AND YEAR (DATEADD (dd, DaysBetween, dt)) = EndYear
于 2013-08-01T07:57:57.870 回答