2013-08-01 38 views
1

我使用SQL Server 2008的生成一天日期+ daydiff

我买了这5列的表格:

StartMonth, StartYear, EndMonth, EndYear, DaysBetween 

我没有一天不这些日期,这就是我想要产生的。

例如:

12  2008 1 2009   8 

我想创建一个随机日期(开始日期和结束日期,格式为DD/MM/YYYY),其中将包括的一天,将使现场时我下

EG之间的数据,如果我知道,我拿到8天(DaysBetween)和startmonth是12日必须 从24/12/2008原因,如果我加入8天,我得到了EndMonth(1/2009)

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

如何生成有效日期?

+0

对不起,可我知道什么是您的输入参数(S)? –

+0

以及生成随机数据的目的是什么? –

回答

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 
+0

使用'RAND'和'NEWID()'不是多余的吗? 'RAND()'本身也会这样做。还有'DAYSBETWEEN + 1 - 1'?整个第一个表达式可能只是'SELECT CAST(DAYSBETWEEN * Rand()+ 1 AS TINYINT)' –

+1

RAND()本身在查询中不起作用!它将为所有行返回一个随机值。 NEWID有助于为每一行重新设置RAND函数。 – Gidil

+1

哦,是的。好想法!我知道有一个原因,我不使用兰德,但想不到:) –

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 
+0

看起来非常好,我需要调整它到我的数据...非常感谢。顺便说一下...我执行了你的查询,我得到了8行可能的日期...我只需要1个随机日期不是8 ...我需要改变才能得到1行? –

+0

@AviShain添加'SELECT TOP 1' ...和..'ORDER BY NEWID()'获得1个随机行 –

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,并添加DaysB再次切口白内障手术挽得到结束日期

SQLFiddle DEMO