GENERATE DATE / TIME DIMENSION IN INFORMATICA

本文介绍如何使用Oracle SQL生成日期维度,包括如何生成指定范围内的连续日期,并通过Informatica实现相同功能。

有人能解释一下下面的SQL么?  查过文献没找到答案.

SELECT LEVEL
FROM dual
CONNECT BY LEVEL < 10

结果是:
1                                   
2                                   
3                                   
4                                   
5                                   
6                                   
7                                   
8                                   
9

level 是个伪列,类似于rownum
connect by 构造了一个循环

好. 如下也有同样结果:

SELECT ROWNUM 
FROM dual
CONNECT BY ROWNUM < 10

另外
SELECT LEVEL  
FROM dual
CONNECT BY 1=1

会得到无穷数列. 

终于有点理解的感觉了. 谢.

 We use database procedures to generate the date dimension for data warehouse applications. Here i am going to show you how to generate the date dimension in informatica.

Let see how to generate list out all the days between two given dates using oracle sql query.

SELECT  to_date('01-JAN-2000','DD-MON-YYYY') + level-1 calendar_date
FROM    dual
connect by level <= 
        ( 
           to_date('31-DEC-2000','DD-MON-YYYY') - 
           to_date('01-JAN-2000','DD-MON-YYYY') + 1
        );

Output:

CALENDAR_DATE
-------------
1/1/2000
1/2/2000
1/3/2000
.
.
.
12/31/2000

Now we can apply date functions on the Calendar date field and can derive the rest of the columns required in a date dimension. 

We will see how to get the list of days between two given dates in informatica. Follow the below steps for creating the mapping in informatica. 

  • Create a source with two ports ( Start_Date and End_Date) in the source analyzer.
  • Create a new mapping in the mapping designer Drag the source definition into the mapping.
  • Create the java transformation in active mode.
  • Drag the ports of source qualifier transformation in to the java transformation.
  • Now edit the java transformation by double clicking on the title bar and go to the "Java Code" tab. Here you will again find sub tabs. Go to the "Import Package" tab and enter the below java code:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

  • Not all these packages are required. However i included just in case if you want to apply any formatting on dates. Go to the "On Input Row" tab and enter the following java code:

int num_days = (int) ((End_Date - Start_Date) / (1000 * 60 * 60 * 24));
long Start_Seconds = Start_Date;

for (int i=1; i <= num_days ; i++)
{
 if (i == 1)
 {
 generateRow();
 }
 else
 {
 Start_Date = Start_Date + (1000 * 60 * 60 * 24);
 generateRow();
 }
}

Start_Date = Start_Date + (1000 * 60 * 60 * 24);
generateRow();

  • Compile the java code by clicking on the compile. This will generate the java class files.
  • Connect only the Start_Date output port from java transformation to expression transformation.
  • Connect the Start_Date port from expression transformation to target and save the mapping.
  • Now create a workflow and session. Enter the following oracle sql query in the Source SQL Query option:

SELECT to_date('01-JAN-2000','DD-MON-YYYY') Start_Date,
       to_date('31-DEC-2000','DD-MON-YYYY') End_Date
FROM   DUAL;

Save the workflow and run. Now in the target you can see the list of dates loaded between the two given dates. 

Note1 : I have used relational table as my source. You can use a flat file instead. 
Note2 : In the expression transformation, create the additional output ports and apply date functions on the Start_Date to derive the data required for date dimension.

<think>我们正在解决用户的问题:如何在使用 `go generate` 命令时指定某个 GO 文件的路径? 根据引用[1]和引用[3]: - `go generate` 命令用于在Go源文件中通过特殊注释(`//go:generate`)指定的命令。 - 这些注释通常放在Go源文件中,然后运行`go generate`命令时会执行这些注释行指定的命令。 - 默认情况下,`go generate` 会扫描当前目录下的所有Go文件(包括子目录,如果使用`./...`),并执行其中所有的`//go:generate`指令。 但是,用户希望指定某个特定的Go文件来执行其中的`//go:generate`指令。 ### 解决方案 1. **理解`go generate`的工作方式**: - `go generate`命令默认会处理当前目录(或指定包路径)下的所有Go文件中的`//go:generate`指令。 - 它不支持直接指定单个文件作为参数(即不能像`go generate filename.go`这样运行)。 2. **指定文件路径的方法**: - 虽然不能直接指定单个文件,但可以通过指定文件所在的包(package)路径来间接实现。 - 例如,如果文件`example.go`位于当前目录下,那么只需进入该目录并运行`go generate`即可。 - 如果不想进入目录,可以使用`-run`标志来匹配特定的生成命令(通过正则表达式),但这需要知道命令的内容。 3. **使用`-run`标志**: - `go generate` 支持 `-run` 标志,后面跟一个正则表达式,用于匹配要执行的生成命令。 - 例如,假设在文件`example.go`中有一条指令:`//go:generate echo hello`,那么可以这样运行: ```bash go generate -run "echo hello" ./... ``` - 但是,这种方法依赖于命令字符串,如果命令很长或者有变量,可能不太方便。 4. **通过指定包路径**: - 因为`go generate`可以接受包路径,所以我们可以指定文件所在的包(即文件所在的目录)来运行。 - 例如,文件`example.go`在目录`./pkg/example`下,那么可以运行: ```bash go generate ./pkg/example ``` - 这样只会处理`./pkg/example`目录下的Go文件。 5. **在文件所在目录运行**: - 最直接的方法是进入文件所在目录,然后运行`go generate`: ```bash cd /path/to/package go generate ``` ### 步骤总结 1. **确定目标文件所在的包(目录)**: - 假设目标文件为`/project/pkg/example/example.go`,则其包路径为`./pkg/example`(相对于项目根目录)。 2. **在项目根目录运行**: ```bash go generate ./pkg/example ``` 3. **或者进入目录运行**: ```bash cd pkg/example go generate ``` ### 注意事项 - 如果目标文件中的`//go:generate`指令依赖环境变量(如`$GOFILE`,`$GOPACKAGE`等),这些变量会在处理该文件时自动设置。 - 使用包路径的方式运行`go generate`时,会处理该包下的所有Go文件中的生成指令。如果只想执行该文件中的指令,而忽略同目录下其他文件中的指令,目前没有直接的方法。但可以通过在指令中使用条件判断(如根据文件名)来避免执行,或者将文件单独放在一个目录中。 ### 示例 假设项目结构如下: ``` project/ ├── main.go └── pkg/ └── example/ ├── example.go └── helper.go ``` 在`example.go`中有生成指令: ```go //go:generate echo "Generating for example.go" ``` 在`helper.go`中也有生成指令: ```go //go:generate echo "Generating for helper.go" ``` 如果只想执行`example.go`中的生成指令,可以: 1. 使用`-run`标志(需要知道命令内容): ```bash go generate -run "echo \"Generating for example.go\"" ./pkg/example ``` 但这种方法如果命令中有变量(如`$GOFILE`)则难以匹配。 2. 将`example.go`单独放在一个目录中(推荐),这样包路径就只包含这一个文件。 3. 修改生成指令,使其可以识别当前文件(通过环境变量): ```go //go:generate sh -c "if [ \"$GOFILE\" = \"example.go\" ]; then echo 'Generating for example.go'; fi" ``` 然后运行整个包: ```bash go generate ./pkg/example ``` ### 结论 虽然`go generate`不直接支持指定单个文件,但可以通过指定文件所在的包路径来运行,从而只处理该包下的所有生成指令。如果只需要处理特定文件,可以考虑将文件单独放在一个包中,或者在生成指令中加入条件判断。 --- §§相关问题§§ 1. 如何在`go generate`命令中使用环境变量? 2. 如何为不同的操作系统编写跨平台的`go generate`指令? 3. 如何避免`go generate`重复执行同一个生成命令? 4. `go generate`与构建标签(build tags)如何结合使用? 5. 如何调试`go generate`命令的执行过程?</think>### 在 `go generate` 中指定文件路径的解决方案 在 Go 中执行 `go generate` 时指定文件路径有两种主要方法,具体取决于您需要执行的生成指令的位置和作用范围: #### 方法 1:在目标文件中直接指定路径(推荐) 在 Go 源文件中使用 `//go:generate` 指令时,可以通过 `$GOFILE` 环境变量或相对路径指定目标文件: ```go // 示例:在 main.go 中指定生成路径 package main //go:generate protoc -I=./proto --go_out=./gen $GOFILE // 使用环境变量[^3] //go:generate stringer -type=Color -output=./gen/color_string.go // 直接指定输出路径[^1] ``` **执行命令**: ```bash # 在包含该文件的目录下运行 go generate ./path/to/your/file.go ``` #### 方法 2:通过命令行参数指定路径 使用 `-run` 标志配合正则表达式过滤特定文件: ```bash # 只处理包含特定标记的文件 go generate -run "YOUR_TAG" ./... # 示例:只处理包含 "mockgen" 指令的文件 go generate -run "mockgen" ./... ``` #### 关键环境变量说明 在 `//go:generate` 指令中可用的路径相关变量[^3]: | 环境变量 | 说明 | 使用示例 | |--------------|-------------------------------|------------------------------| | `$GOFILE` | 当前处理的文件名 | `--source=$GOFILE` | | `$GOPACKAGE` | 当前文件的包名 | `--package=$GOPACKAGE` | | `$GOLINE` | 指令在文件中的行号 | `--line=$GOLINE` | | `$PWD` | 当前工作目录(需手动导出) | `-output=$PWD/gen` | #### 完整工作流示例 1. 在 `types.go` 中定义生成指令: ```go //go:generate stringer -type=Status -output=../gen/status_string.go type Status int const ( Pending Status = iota Active Completed ) ``` 2. 执行生成命令: ```bash # 在项目根目录执行 go generate ./internal/types/types.go ``` 3. 验证输出: ```bash ls ./gen # 输出: status_string.go ``` #### 注意事项 1. 路径解析规则: - 相对路径基于**执行命令的目录**(非文件所在目录) - 使用 `$PWD` 可获取绝对路径: ```go //go:generate sh -c "protoc -I=$PWD/proto --go_out=$PWD/gen" ``` 2. 跨平台路径处理: ```go //go:generate sh -c "if [ $GOOS = 'windows' ]; then ./tools/gen.exe; else ./tools/gen; fi" ``` 3. 工具依赖管理: ```bash # 在生成指令前安装所需工具 go install golang.org/x/tools/cmd/stringer@latest ``` > **最佳实践**:在文件顶部显式声明路径依赖,如 `//go:generate mkdir -p ../gen && stringer -type=Color -output=../gen/color_string.go`[^1][^4] ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值