Sql 根据现有月份生成日期+;年份+;代迪夫
我正在使用SQLServer2008 我得到了一个包含以下5列的表: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,那
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)
如何生成有效日期?您需要使用以下部件来解决此问题:
日期之间的随机值
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函数的种子。哦,是的。好主意!我知道我不使用兰德有一个原因,但我想不起来:)