对于每一行,获取列之间的所有日期并插入列

时间:2015-11-10 11:28:40

标签: sql sql-server tsql date recursion

我有一个表变量,我用特定范围(和dw,wk,mm,yy,dd值)之间的所有日期填充

然后我在开始日期之前加入到我的检查记录中。

SELECT     CalDate
           , DayN
           , WeekN
           , YearN
           , DayOfMonthN
           , [Start Date]
           , [End Date]
           , [Inspection Number] 
FROM       @Calendar             AS dateInfo
LEFT JOIN  [Inspection Records]  AS IR 
    ON     IR.[Start Date]       = dateInfo.CalendarDate

这个工作正常,我现在需要做的事情(我必须这样做以传递给第三方应用程序...)获取[开始日期]和[结束日期]之间的所有日期并将它们作为逗号分隔列表添加到列中。

我已经看到了这个答案t-sql get all dates between 2 dates 这似乎完全符合我的需要。

我坚持如何构建我的脚本以使用该脚本获取[开始日期]和[结束日期]之间的所有日期并将它们添加到列中。

  • 计算我的两列之间所有日期的最佳方法是什么
  • 如何将结果作为逗号分隔列表
  • 插入单个列

注意:我无法向数据库添加任何内容。

示例:(试图获取日期列)



  <table>
    <tr>
    <td>CalDate</td>
    <td>DayN</td>
    <td>WeekN</td>
    <td>YearN</td>
    <td>DayOfMonthN</td>
    <td>Start Date</td>
    <td>End Date</td>
    <td>Inspection Number</td>
    <td>Dates</td>
    </tr>
    <tr>
    <td>07-08-2014</td>
    <td>5</td>
    <td>32</td>
    <td>2014</td>
    <td>7</td>
    <td>07-08-2014</td>
    <td>11-08-2014</td>
    <td>A0001</td>
<td>07-08-2014,08-08-2014,09-08-2014,10-08-2014,11-08-2014</td>
    </tr>
    </table>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

SELECT     CalDate
           , DayN
           , WeekN
           , YearN
           , DayOfMonthN
           , [Start Date]
           , [End Date]
           , [Inspection Number]
           , [Dates] = STUFF((
                SELECT     ',' + CONVERT(VARCHAR(10), C.CalDate,105)
                FROM       @Calendar AS C
                WHERE      C.CalDate BETWEEN IR.[Start Date] AND IR.[End Date]
                FOR XML    PATH('')
            ), 1, 1, '')
FROM       @Calendar             AS dateInfo
LEFT JOIN  [Inspection Records]  AS IR 
    ON     IR.[Start Date]       = dateInfo.CalendarDate

答案 1 :(得分:0)

这会将您的所有日期都放入名为@csv的变量中。 我确定你能够根据自己的需要进行修改.......

DECLARE @csv nVarchar(max)
SELECT @csv = COALESCE(@csv + ', ', '') + CONVERT(Nvarchar(20), yourDateColumn) 
FROM yourDateTable