Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据现有月份生成日期+;年份+;代迪夫_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 根据现有月份生成日期+;年份+;代迪夫

Sql 根据现有月份生成日期+;年份+;代迪夫,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在使用SQLServer2008 我得到了一个包含以下5列的表: StartMonth, StartYear, EndMonth, EndYear, DaysBetween 我没有这些日期的日期,这就是我试图产生的 例如: 12 2008 1 2009 8 我想创建一个随机日期(开始日期和结束日期,格式为dd/mm/yyyy),其中包括日期,并将根据我在之间的天数下的数据制作场景 例如,如果我知道我有8天(days介于之间),并且startmonth是12,那

我正在使用SQLServer2008

我得到了一个包含以下5列的表:

StartMonth, StartYear, EndMonth, EndYear, DaysBetween
我没有这些日期的日期,这就是我试图产生的

例如:

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

例如,如果我知道我有8天(
days介于
之间),并且
startmonth
是12,那么日期必须是
从2008年12月24日起,如果我增加8天,我将获得
月末
(2009年1月)

如果我选择2008年12月2日,我会得到2008年12月10日,这不是一个好理由,因为这个月仍然是12。。。。我需要1(2009)


如何生成有效日期?

您需要使用以下部件来解决此问题:

  • 创建一个介于1和
    日期之间的随机值
  • 使用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 
    
    像这样的

    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
    
    以下是一个示例:

    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(校验和(NewId())%DaysBetween+1
    用于获取介于1和DaysBetween之间的随机天数

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

    然后减去这两个值得到StartDate,再加上中间的Days得到EndDate


    对不起,请问您的输入参数是什么?生成随机日期的目的是什么?看起来很好,我需要根据我的数据进行调整…非常感谢。顺便说一下…我执行了你的查询,我得到了8行8个可能的日期。。。我只需要1个随机日期,而不是8个…我需要更改什么才能只获得1行?@AviShain Add
    选择前1行
    。。。和
    orderbynewid()
    获取1个随机行同时使用
    RAND
    NEWID()
    不是多余的吗
    RAND()
    单独使用也可以做到这一点。还有+1-1之间的
    ?整个第一个表达式可以是
    SELECT CAST(DAYSBETWEEN*Rand()+1作为TINYINT)
    Rand()单独在查询中不起作用!它将为所有行返回一个随机值。NEWID帮助为每一行重新设定RAND函数的种子。哦,是的。好主意!我知道我不使用兰德有一个原因,但我想不起来:)