SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表
Posted
技术标签:
【中文标题】SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表【英文标题】:SQL - Create a table with unique date & currency records for every currency code in a table (between two defined dates) 【发布时间】:2021-04-01 19:33:02 【问题描述】:所以我有一个包含约 40 条记录的货币代码表和一个生成两天之间日期列表的查询。 (我也有一张桌子,但我认为这样可以)
我们的目标是创建一个包含货币和日期的每种组合的表格。因此,如果有 4 种货币和 10 天,那么每种组合将有 400 条记录。
感谢您的任何见解!
PK | Currency |
---|---|
1 | USD |
2 | EUR |
3 | CAD |
4 | KRW |
5 | CNY |
6 | JPY |
7 | GBP |
8 | PLN |
9 | NZD |
... | ... |
DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
SET @StartDateTime = Getdate()-15
SET @EndDateTime = Getdate()-1
;WITH DateRange(DateData) AS
(
SELECT @StartDateTime as Date
UNION ALL
SELECT DATEADD(d,1,DateData)
FROM DateRange
WHERE DateData < @EndDateTime
)
SELECT CAST(DateData as Date)
FROM DateRange
【问题讨论】:
【参考方案1】:交叉连接就是你想要的。
WITH DateRange(DateData) AS
(
SELECT @StartDateTime as Date
UNION ALL
SELECT DATEADD(d,1,DateData)
FROM DateRange
WHERE DateData < @EndDateTime
)
SELECT DateData, Currency
FROM DateRange
CROSS JOIN CurrencyTableName
如果一列已经是日期类型,则不必将其强制转换为日期
【讨论】:
太棒了,它就在我的眼皮底下……DECLARE @StartDateTime DATETIME DECLARE @EndDateTime DATETIME SET @StartDateTime Getdate()-15 SET @EndDateTime = Getdate()-1 ;WITH DateRange(DateData) AS ( SELECT @StartDateTime as Date UNION ALL SELECT DATEADD(d,1,DateData) FROM DateRange WHERE DateData < @EndDateTime ) Select * from DateRange CROSS JOIN CURRENCIES
@charleface 和任何关心的人——并非所有平台都需要 CROSS JOIN 关键字。以上是关于SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表的主要内容,如果未能解决你的问题,请参考以下文章