【问题标题】:Union Query of Date Fields in MS Access 2010MS Access 2010中日期字段的联合查询
【发布时间】:2018-03-15 14:53:38
【问题描述】:

我在一个包含三个字段的数据表 TableofDates 中有条目; ProjectID (type = dbText)、Start (type = dbDate) 和 Finish (type = dbDate):

日期表

ProjectID   Start       Finish  
ABC         01/01/2018  09/09/2018

我希望呈现以下数据集,其中包含单独的 DateA 记录(源自 [TableofDates] 中的 [Start])和 DateB 记录(源自 [TableofDates] 中的 [Finish] 形式)

ToD UNION

ProjectID   DateA       DateB
ABC         01/01/2018  
ABC                     09/09/2018

以下 SQL 查询几乎可以产生所需的结果:

SELECT ProjectID,DateA, '' AS DateB
FROM DtA
UNION SELECT ProjectID, '' AS DateA,DateB
FROM DtB;

我遇到的问题是插入的空字符串强制字段数据键入 dbText。

如果我插入 Null,则只会复制第一个日期字段:

SELECT ProjectID, DateA, Null AS DateB 
FROM DtA 
UNION SELECT ProjectID, Null AS DateA, DateB 
FROM DtB;

产量:

ToD UNION
ProjectID   DateA       DateB
ABC         01/01/2018  
ABC     

工会的两个部分单独工作:

SELECT ProjectID,DateA, Null AS DateB
FROM DtA;

产量

ToD UNION
ProjectID   DateA        DateB
ABC         01/01/2018  

虽然

SELECT ProjectID,Null AS DateA,  DateB
FROM DtB;

产量

ToD UNION
ProjectID   DateA       DateB
ABC                     09/09/2018

有什么想法可以根据需要使用插入的“Null”日期创建 TableofDates 的联合,并在结果数据集中维护 dbDate 的数据类型?

【问题讨论】:

    标签: sql ms-access ms-access-2010


    【解决方案1】:

    您可以使用标题行(返回 0 条记录但包含正确类型和标签的选择语句)

    SELECT CLng(1) As ProjectID, #2001-01-01# As DateA, #2001-01-01# As DateB
    FROM MSysObjects
    WHERE 1=0
    UNION ALL
    SELECT ProjectID, DateA, Null 
    FROM DtA 
    UNION ALL
    SELECT ProjectID, Null, DateB 
    FROM DtB;
    

    您的查询不起作用,因为在 Access 中,联合查询的第一个查询决定了字段的类型和标签。因为第一个查询的最后一列只包含Null,所以Access无法确定字段类型,选择了错误的字段。

    通过使用不返回记录但明确设置字段类型的查询,您可以避免该问题。

    请注意,从 UNION(类型转换和检查重复项)到 UNION ALL(不做这些事情)的更改也解决了这个问题。所以 2 个解决方案只需 1 个的价格。

    【讨论】:

    • 先生,感谢您的出色工作。但是,我不明白为什么我的查询不起作用。你有什么主意吗? SELECT ProjectID, DateA, Null AS DateB FROM DtA UNION SELECT ProjectID, Null AS DateA, DateB FROM DtB;
    【解决方案2】:

    联合查询将忽略字段别名,但第一个 SELECT 语句中的别名除外。

    NULL 值小于任何日期值,因此降序排序会将 NULLS 放在首位。

    此 SQL 生成您的示例输出:

    SELECT              ProjectID, Start AS DateA, NULL AS DateB
    FROM                TableOfDates
    
    UNION ALL SELECT    ProjectID, NULL, Finish
    FROM                TableOfDates
    ORDER BY            ProjectID, DateA DESC  
    

    这张桌子:

    ProjectID   Start       Finish  
    ABC         01/01/2018  09/09/2018  
    DEF         01/02/2017  03/05/2018  
    

    产生了这个结果:

    ProjectID   DateA       DateB  
    ABC         01/01/2018    
    ABC                     09/09/2018  
    DEF         01/02/2017  
    DEF                     03/05/2018
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多