从Excel迁移到Access并遇到一些困难,我希望有人可以帮助我。
我有一个充满遇到数据的表(Table: EncData
);该数据的一部分是遭遇日期(Column: EncDateTime
)。
在我的查询中,我需要有一个列,显示该日期是 Weekend , Weekday 还是 Holiday 。周末和工作日部分对我来说不是问题(幸运的是Format()
)。我正在努力解决如何将遭遇日期与假日查找表(Table: Holidays
)相匹配的问题。
在Excel中,我使用了一个使用Match()
的公式来查看它是否返回了假期。我如何在Access中执行此操作?
TABLE: Holidays
ID__________HolidayDate
1 10/8/2012
2 9/3/2012
TABLE: EncData
ID__________EncDateTime__________________More Data
12 10/08/2012 09:15:12 AM (etc)
在我的查询中(显示来自EncData
表的信息),我一直在玩DLookup而没有成功只是为了看看我是否能找到匹配项:
DLookup("HolidayDate", "Holidays", "HolidayDate =" & Format([EncDateTime],"mm/dd/yyyy"))
即使这不起作用,我也可以说它也很慢。
对SQL知之甚少,但我认为这应该很简单。
由于
答案 0 :(得分:2)
SQL中的日期表示为#year / month / day#,例如。今天的日期是#2012/11/19#,要使DLookup工作,你必须使用这种语法:
DLookup("HolidayDate", "Holidays", "HolidayDate=" & Format([EncDateTime],"\#yyyy/mm/dd\#"))
要检查今天是否是假日,您可以使用此:
DLookup("HolidayDate", "Holidays", "HolidayDate=" & Format(Date(),"\#yyyy/mm/dd\#"))
是的,DLookup很慢,你不应该在查询中使用它。要检查EncDateTime
是否为假期,您应该使用此SQL代码加入EncData
和Holidays
togheter:
SELECT EncData.*
FROM EncData INNER JOIN Holidays ON EncData.EncDateTime = Holidays.HolidayDate
这应该返回所有作为hoildays的EncData行。它应该,但它可能没有。请注意,EncDateTime不仅包含日期,还包含时间,因此它与仅包含日期的HolidayDate不匹配。这适用于:
SELECT EncData.*
FROM EncData INNER JOIN Holidays ON DateValue(EncData.EncDateTime) = Holidays.HolidayDate
并提取EncData中的所有行,而不仅仅是假期?
SELECT EncData.*, Holidays.HolidayDate
FROM EncData LEFT JOIN Holidays ON DateValue(EncData.EncDateTime) = Holidays.HolidayDate
请注意,当HolidayDate仅在该日假日时包含日期时,否则它将为NULL。
这些只是一些基本的想法。但是不要忘记您可以使用向导进行查询,然后您可以随时查看SQL代码的外观。
答案 1 :(得分:0)
在这里使用fthiella的代码建议是我最终使用IIf
语句来确定日期是 Holiday , Weekday ,或 Weekend 。
SELECT EncData.*,
IIf(ISNULL(Holidays.HolidayDate),IIf(Weekday(EncData.EncDateTime) = 1 or Weekday(EncData.EncDateTime) = 7,"Weekend","Weekday"),"Holiday") AS [DayType]
FROM EncData
LEFT JOIN Holidays ON DateValue(EncData.EncDateTime)=Holidays.HolidayDate;
我不确定我是否应该使用CASE
语句(它们更快吗?)但这暂时有效。谢谢!