Access 2003中SQL交换机打破了数据类型?
-
20-09-2019 - |
题
我跑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()
功能保持破:(