我有一个表T1
与一些日期/时间字段。我将这个表上的几个查询与一个UNION查询结合起来,并在UNION上使用SELECT INTO创建了一个新表T2
,如下所示:
SELECT * INTO T2
FROM (select * from query1_T1
union
select * from query2_T1)
问题是query1_T1
为一些日期字段替换了一个空白字符串常量,这导致T2具有文本字段而不是日期/时间字段。说明:
query1_T1:
select myUDF(someTextField),"" as newDateField from T1
query2_T1:
select anotherUDF(someTextField),oldDateField from T1
其中oldDateField
为日期/时间。
是否有一种方法,我可以结构SELECT INTO,或更改query1_T1
,这样我仍然会从查询中得到相同的结果,但newDateField
将最终作为日期/时间?
始终可以将创建表与向其中添加数据分开。首先,用适当的数据类型定义所有字段。然后使用INSERT INTO (columns) SELECT * FROM
填充它。
更新:
或者您可以使用混合方法。首先用做SELECT INTO
,没有行:
SELECT * INTO T2
FROM query2_T1
WHERE 1=0
这将创建你的大部分结构。然后,您可以手动调整任何没有正确通过的数据类型。
调整好结构后,您可以安全地执行此操作:
INSERT INTO T2
SELECT * FROM query1_T1
UNION
SELECT * FROM query2_T1
您可以通过简单的
解决这个问题。将
query1_T1
更改为返回Null
而不是空字符串作为第二列,并且将您联合在一起的查询的顺序颠倒
,
SELECT * INTO T2
FROM
(
select * from query2_T1
UNION ALL
select * from query1_T1
)
这样,当T2的表结构由第一个union查询确定时,第二列包含一些日期值,并且第二个查询不会在之后强制该列为Text。
我没有在Access中尝试过,但是您可以在几乎任何其他数据库中使用cast()
。Access中的对应函数是cdate()
。试一试:
cdate(NULL) as newDateField
如果你需要一个实际的值,那么像这样:
cdate('1900-01-01')