2

我有一个T1包含一些日期/时间字段的表格。我已经将此表上的几个查询与一个 UNION 查询组合在一起,并在T2联合上使用 SELECT INTO 创建了一个新表,如下所示:

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 或 change query1_T1,以便我仍然可以从查询中获得相同的结果,但newDateField最终会成为日期/时间?

4

3 回答 3

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
于 2013-05-02T18:09:25.967 回答
2

您可以通过简单地解决此问题

  • 更改query1_T1为返回Null而不是空字符串作为第二列,并且

  • 颠倒您联合在一起的查询的顺序

那是,

SELECT * INTO T2
FROM 
(
select * from query2_T1
UNION ALL
select * from query1_T1
)

这样,当 T2 的表结构由第一个 UNIONed 查询确定时,第二列包含一些日期值,之后第二个查询不会将该列强制为 Text。

于 2013-05-02T17:18:47.103 回答
1

我没有在 Access 中尝试过,但您cast()几乎可以在任何其他数据库中使用。Access 中的等效功能是cdate(). 尝试:

cdate(NULL) as newDateField

如果您需要一个实际值,则类似于:

cdate('1900-01-01')
于 2013-05-02T16:53:44.727 回答