我跑Access 2003中我使用开关来选择基于一个布尔标准日期字段:

Switch(<criterion>, Date1, 1, Date2)

即,如果“标准”为真,则返回日期1,否则返回日期2。

日期1和date2是日期/时间类型列在表中。

问题是,交换机将它们作为文本 - !不日期/时间

有没有办法迫使他们到日期的烦躁?我试图

Switch(<criterion>, #Date1#, 1, #Date2#)

Switch(<criterion>, Val(Date1), 1, Val(Date2))

这两者失败,一个错误消息或另一种。

任何想法?

有帮助吗?

解决方案

我觉得今天要是[IIF()函数是你要怎样做更好的匹配:

IIf(<criterion>, Date1, Date2)

但是开关()函数不应该打破的数据类型,并且不与日期/时间数据类型不兼容。考虑这样的功能:

Public Function trySwitch(ByVal pWhichDay As String) As Variant
    Dim varOut As Variant
    varOut = Switch(pWhichDay = "yesterday", Date - 1, _
        pWhichDay = "today", Date, _
        pWhichDay = "tomorrow", Date + 1)
    trySwitch = varOut
End Function

<强> trySwitch( “今天”)返回的 10/6/2009 和<强>类型名(trySwitch( “今天”))返回的日期

其他提示

有很奇怪的东西与你的例子。

切换接受表达对,并且如果第一评估为真,则返回其配对值,否则,它通过在所述第二,并评估该参数。

您似乎在治疗1为True,这是因为它不是费尔斯,但你会用更好:

  Switch(<criterion>, Date1, True, Date2)

但是,这只是一个的立即如果功能的功能性复制,IIF(),和IIF()开更少的参数。

但它具有相同的问题,即它返回一个变体。但是,你应该能够要挟,要能够格式化为一个日期数据类型。

不过,不论该变种会隐含强迫或你需要明确地做到这一点,取决于你用它在哪里。在查询的结果,可以从排序IIF([标准],日期1,日期2),为日期的输出,因为该列被强制转换成日期类型。

如果你必须明确地做胁迫,CDATE()是使用功能 - 你会包裹的是,为了产生变体输出与CDATE()函数是某些外部功能是变体输出明确地强制转换成日期类型:

  CDate(IIf(<criterion>, Date1, Date2))

不过,我很可能会在这里失去了一些重要的东西,因为我似乎被关闭了完全不同的轨迹......

您可以张贴一些代码和数据重现该问题,请?由于这是在SQL代码SWITCH()那么我认为SQL DDL(CREATE TABLE等)和DML(INSERT INTO添加数据)是最合适的:)

[挑剔点:Access数据库SQL不具有“布尔”的数据类型。它有其可以是YESNO值的NULL数据类型;三值逻辑不是布尔值。]

下面是一些SQL DML( ANSI-92查询模式语法)演示运行方式如预期的我:

SELECT TYPENAME
       (
          SWITCH
          (
             NULL, #2009-01-01 00:00:00#, 
             FALSE, #2009-06-15 12:00:00#, 
             TRUE, #2009-12-31 23:59:59#
          )
       );

更改任何“标准”值和该值始终返回类型DATETIME的“日期”即


更新:

  

TYPENAME功能是一个很大的   工具...访问似乎解释   整个结果集的“列”   不同

事实上。因为列只能是一种数据类型TYPENAME()中的该行的结果可能是误导性的。混合类型的行值必须为“提升”到一个更高的数据类型。正如以往的Access数据库引擎,这个过程是完全不透明的,关于这个问题的文件完全不存在,所以你只需要吮吸它,例如见

SELECT #2009-01-01 00:00:00# AS row_value, 
       TYPENAME(#2009-01-01 00:00:00#) AS row_type
  FROM Customers
UNION ALL
SELECT 0.5, 
       TYPENAME(0.5) AS row_type
  FROM Customers

返回“日期”和“小数”,但会出现什么栏呢?显然,回答是:

SELECT DT1.row_value, TYPENAME(DT1.row_value) AS column_type
  FROM (
        SELECT DISTINCT #2009-01-01 00:00:00# AS row_value 
          FROM Customers
        UNION ALL
        SELECT DISTINCT 0.5
          FROM Customers
       ) AS DT1;

'STRING'?!

...这当然是甚至没有Access数据库引擎SQL数据类型。所以TYPENAME(),烦人,使用“最适合” VBA类型的名称。例如:

SELECT TYPENAME(CBOOL(0));

返回“布尔”即使,如以上所讨论,存在Access数据库引擎SQL没有布尔数据类型。和

SELECT TYPENAME(my_binary_col)

返回字符串 ''。注意相同的VBA映射限制适用于CAST函数(又一烦恼)例如没有“投射到BINARY”功能和自喷气4.0 CDEC()功能保持破:(

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top