提取(来自'现在')的错误

时间:2017-05-26 08:14:54

标签: sql firebird firebird2.5

我在我的树莓皮上运行了一只超级经典的火鸟2.5。我执行以下查询,它给出以下错误:

SELECT foodmanager1.F_US_FIRSTNAME,foodmanager1.F_US_LASTNAME, 
foodmanager1.F_US_PICTURE_URL,
foodmanager2.F_US_FIRSTNAME, foodmanager2.F_US_LASTNAME, 
foodmanager2.F_US_PICTURE_URL,
duty.F_US_FIRSTNAME, duty.F_US_LASTNAME,
duty.F_US_PICTURE_URL,
a.F_FD_DATE from
    T_FOOD_DUTY a
inner join T_USER foodmanager1 on a.F_US_ID1 = foodmanager1.F_US_ID
inner join T_USER foodmanager2 on a.F_US_ID2 = foodmanager2.F_US_ID
inner join T_USER duty on a.F_US_ID3 = duty.F_US_ID
where extract(week from a.F_FD_DATE) = extract(week from 'Now')

出现此错误:

  

输入数据类型

中不存在指定的EXTRACT部分

SQL错误代码= ~105。

我知道问题出在extract(week from 'Now')上,因为当我用数字手动替换它时,我会得到一些结果。

知道问题是什么,或者你有其他选择吗?

2 个答案:

答案 0 :(得分:4)

问题是extract接受任何数据类型,但仅适用于datetimetimestamp类型。在此上下文中,'Now'只是char(3),因此无法使用提取(无法从char类型中提取数据)。

这种混淆源于这样一个事实,即在某些情境中(例如,分配或明确转换为datetimetimestamp),'Now'将产生当前日期/时间。它在这种情况下不起作用,因为Firebird无法知道它需要哪三种类型;理论上extract接受任何类型,它实际可以做的是由它接收的类型决定。

您需要将其明确强制转换为date(或timestamp):

  1. 使用显式广播:

    extract(week from cast('Now' as date))
    
  2. 使用类型导入器(又名速记):

    extract(week from date'Now')
    
  3. 或者,正如answer of ain中所建议的那样,使用SQL标准“函数”current_datecurrent_timestamp

    extract(week from current_date)
    

答案 1 :(得分:3)

使用SQL标准CURRENT_TIMESTAMP(或CURRENT_DATE,因为时间部分在提取周时不重要)而不是'NOW'

extract(week from CURRENT_TIMESTAMP)

或者,如果您真的想使用'NOW',请将其投射到日期:

extract(week from CAST('Now' AS DATE))