在我的SQL SELECT语句中找不到语法错误

时间:2017-05-01 13:30:51

标签: sql access-vba

我的SQL SELECT语句中出现语法错误。我知道这是语句末尾的DateDiff函数的问题,但我似乎无法找到正确的格式。我确信它很简单,但我找不到它。

"SELECT 
     tblAllSchedules.[Schedule Name], 
     tblAllSchedules.[Arvl Sta],  
     (' & Format(DateValue([tblAllSchedules]![Arvl Local Date/Time]),'ddd') & ')' AS [Day], 
     DateValue([tblAllSchedules]![Arvl Local Date/Time]) AS [Date], 
     tblAllSchedules.Metal, tblAllSchedules.Type, 
     tblAllSchedules.[Key ID], tblAllSchedules.[LAA NB], 
     tblAllSchedules.[LAA WB], tblAllSchedules.[LUS NB], 
     tblAllSchedules.[LUS WB], tblAllSchedules.[Sub Fleet], 
     'Original', '" & csName & "', (' & DateDiff('d', '" & FSun & "',  [Tables]![tblAllSchedules]![Arvl Local Date/Time])+ 1 & ')' AS CompSchedDay"

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

有人刚刚发布了获奖答案,但在我回应之前它已经消失了。这是更正的语法。

    SELECT tblAllSchedules.[Schedule Name], tblAllSchedules.[Arvl Sta], 
Format(DateValue([tblAllSchedules]![Arvl Local Date/Time]),'ddd') AS [Day], 
DateValue([tblAllSchedules]![Arvl Local Date/Time]) AS [Date], 
tblAllSchedules.Metal, tblAllSchedules.Type, tblAllSchedules.[Key ID], 
tblAllSchedules.[LAA NB], tblAllSchedules.[LAA WB], tblAllSchedules.[LUS NB], 
tblAllSchedules.[LUS WB], tblAllSchedules.[Sub Fleet], 'Original', '" & csName & "', 
DateDiff('d', '" & FSun & "' ,  [tblAllSchedules]![Arvl Local Date/Time])+ 1 AS CompSchedDay

我觉得我把它弄得太乱,而且比它需要的更复杂。现在唯一的问题是纠正新的"凝聚功能"错误。谢谢大家的快速和有益的评论。

答案 1 :(得分:0)

FSun必须是有效的日期表达式。所以试试:

Dim FSun As String
FSun = Format(YourFSunDateValue, "yyyy\/mm\/dd")

"SELECT 
    tblAllSchedules.[Schedule Name], 
    tblAllSchedules.[Arvl Sta],  
    Format([tblAllSchedules]![Arvl Local Date/Time]),'ddd') AS [Day], 
    DateValue([tblAllSchedules]![Arvl Local Date/Time]) AS [Date], 
    tblAllSchedules.Metal, 
    tblAllSchedules.Type, 
    tblAllSchedules.[Key ID], 
    tblAllSchedules.[LAA NB], 
    tblAllSchedules.[LAA WB], 
    tblAllSchedules.[LUS NB], 
    tblAllSchedules.[LUS WB], 
    tblAllSchedules.[Sub Fleet], 
    'Original', 
    '" & csName & "', 
    DateDiff('d', #" & FSun & "#, [tblAllSchedules]![Arvl Local Date/Time]) + 1 AS CompSchedDay
FROM
    tblAllSchedules"

答案 2 :(得分:0)

请尝试以下方法......

SELECT [Schedule Name],
       [Arvl Sta],
       '(' & FORMAT( DATEVALUE( [Arvl Local Date/Time] ), 'ddd') & ')' AS [Day], 
       DATEVALUE( [Arvl Local Date/Time] ) AS [Date],
       Metal,
       [Type],
       [Key ID],
       [LAA NB],
       [LAA WB],
       [LUS NB],
       [LUS WB],
       [Sub Fleet],
       'Original',
       '''' & csName & '''',
       '(' & ( DATEDIFF( 'd', FSun, DATEVALUE( [Arvl Local Date/Time] ) ) + 1 ) & ')' AS CompSchedDay
FROM tblAllSchedules;

首先,您对某些行使用了tblAllSchedules.,而对其他行使用了tblAllSchedules!。除非您同时拥有一个名为tblAllSchedules的表格,否则您应该坚持使用前者来引用表格中的字段。后者用于引用表单或报表中的字段和控件。现在,我假设您的语句仅引用名为tblAllSchedules的表中的字段。

其次,如果所有字段都来自同一个表,即FROM子句中指定的字段,那么您不需要针对每个字段指定表的名称。如果有来自表单,那么您应该使用frmAllSchedules!txtDate之类的符号。

第三,尝试在语句的SELECT部分为每个字段指定自己的行。这样可以更容易地找到目标字段,以及识别何时引用两个单独选择的字段或者以某种方式使用两个字段来形成另一个字段(这两个字段似乎都出现在最后一行)。

第四,您似乎试图围绕日期值的字符串表示放置(),例如(Wednesday)(12)。要执行此操作,您需要将'放在左侧开始括号的侧面以及结束括号中,并将其与您的值连接。

第五,您似乎试图在输出中'的任意一侧放置csName。为此,您需要从''开始,以表示字符串的开头和结尾。在这些地方的中间还有两个''(给你''''),这就是你告诉它你希望它返回一个单'作为其内容的字符串。< / p>

第六,您应该考虑为'Original''''' & csName & ''''添加别名 - 如果您不这样做,Access会随意给他们一个。

如果您有任何问题或意见,请随时发表评论。