我有一个表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
最终将作为日期/时间?
答案 0 :(得分:5)
您始终可以单独创建表,而不是将数据添加到表中。首先,使用适当的数据类型定义所有字段。然后使用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
答案 1 :(得分:2)
您只需
即可解决此问题将query1_T1
更改为返回Null
而不是空字符串作为第二列,
将UNION的查询顺序颠倒过来
即,
SELECT * INTO T2
FROM
(
select * from query2_T1
UNION ALL
select * from query1_T1
)
这样,当T2的表结构由第一个UNIONed查询确定时,第二列包含一些日期值,第二个查询不会强制该列之后的文本。 / p>
答案 2 :(得分:1)
我没有在Access中尝试过这个,但您几乎可以在任何其他数据库中使用cast()
。 Access中的等效函数是cdate()
。尝试:
cdate(NULL) as newDateField
如果你需要一个实际值,那么就像:
cdate('1900-01-01')