1

SQL Server 2008 を使用しています。

これらの5つの列を持つテーブルを取得しました:

StartMonth, StartYear, EndMonth, EndYear, DaysBetween

私はこれらの日付の日を持っていません。それが私が生成しようとしているものです。

例えば:

12     2008  1  2009         8

日を含むランダムな日付 (開始日と終了日、dd/mm/yyyy の形式)作成したい。

たとえば、8 日 ( DaysBetween) があり、startmonth12 であることがわかっている場合、日付は 2008 年 12 月 24 日からである必要があります 。8 日を追加すると、EndMonth(1/2009)になります。

2008 年 2 月 12 日の日付を選択すると、2008 年 10 月 12 日となりますが、月がまだ 12 であるため良くありません....そして 1 (2009) が必要です。

有効な日付を生成するにはどうすればよいですか?

4

3 に答える 3

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 に答える
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) 終了月の最初の日付を取得します (最も早い終了日)

次に、2 つを減算して StartDate を取得し、DaysBetween を再度追加して EndDate を取得します。

SQLFiddle デモ

于 2013-08-01T08:07:09.000 に答える
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 に答える