【问题标题】:How to add an extra temp date column using the select query in SQL Server如何使用 SQL Server 中的选择查询添加额外的临时日期列
【发布时间】:2018-06-25 17:54:48
【问题描述】:

我正在尝试使用特定的 where 条件在 select 语句中添加一个额外的日期列。

下面是我当前的表格:

table

我想添加一个额外的 Date 列,该列添加 >=Start 和

output

此查询出错:

SELECT 
    *, temp_Date AS Date  
FROM 
    Mytable  
WHERE
    Date >= Start AND Date <= End - 2

提前致谢。

【问题讨论】:

  • 请使用文字代替图片。
  • 无论何时出现错误,都应在问题中包含该错误。

标签: sql sql-server date select netezza


【解决方案1】:

将此语句视为虚拟数据:

CREATE TABLE MyTable
(
    id int not null,
    startDate date not null,
    endDate date not null,
    val int not null
)

insert into MyTable
values
(10,'20171106','20171112',7),
(10,'20171106','20171112',6),
(10,'20171106','20171112',5),
(10,'20171106','20171112',0),
(10,'20171106','20171112',2)

使用recursive CTE 选择每个元组作为开始日期并递增该日期直到它到达结束日期,如下所示:

;WITH rc AS (
   SELECT id, startDate, endDate, val
      , startDate AS temp_date
   FROM MyTable
   UNION ALL
   SELECT id, startDate, endDate, val
      , DATEADD(DAY,1,temp_date)
   FROM rc
   WHERE DATEADD(DAY,1,temp_date) <= enddate
)
SELECT *
FROM rc

您应该知道,SQL-Server 中的递归在处理较大数据时代价高昂且速度较慢。还记得提示最大递归循环量,因为默认值为 100。示例:

OPTION (MAXRECURSION 0)

0 表示无限递归,有无限运行的风险。

正如我所读到的,您正在使用数据仓库,因此它应该具有时间或日期维度。在这种情况下,一个简单的连接就可以完成这项工作:

SELECT id, startDate, endDate, val
, date_sid AS temp_date
FROM MyTable AS m
INNER JOIN DimDate AS dd
ON dd.date_sid >= startDate
AND dd.date_sid <= endDate

请考虑不要为列名使用保留键(如开始、结束或值)

【讨论】:

    【解决方案2】:

    试试这个:

    Select M.*
           , Temp_date = Datediff(day, M.start, dateadd(day,-2,M.end))
    from   MyTable M
    

    【讨论】:

    • 感谢 StelioK 的快速回复。我在 Netezza 中查询,所以我怀疑 datediff 是否可用。上面的查询给出了一个错误,指出找不到 Temp_date。
    • 哦,我为此道歉。我没有意识到你没有使用 sql server。我想尝试在 Netezza 中找到等效的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2018-09-15
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多