提取('Now' 周)错误

extract(week from 'Now') error

我是 运行 我的 raspberrypi 上的 firebird 2.5 superclassic。我执行以下查询并出现以下错误:

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')

出现此错误:

Specified EXTRACT part does not exist in input datatype

SQL 错误代码=~105.

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

知道问题出在哪里吗,或者您有其他选择吗?

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

混淆源于这样一个事实,即在某些情况下(例如赋值或显式转换为 datetimetimestamp),'Now' 将产生当前 date/time。它在这种情况下不起作用,因为 Firebird 不知道它需要三种类型中的哪一种;理论上extract接受任何类型,实际能做什么取决于它接收的类型。

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

  1. 使用显式转换:

    extract(week from cast('Now' as date))
    
  2. 使用类型介绍器(又名 shorthand 转换):

    extract(week from date'Now')
    
  3. 或者,按照 中的建议,使用 SQL 标准 'function' current_datecurrent_timestamp:

    extract(week from current_date)
    

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

extract(week from CURRENT_TIMESTAMP)

或者,如果您真的想使用 'NOW',则将其转换为日期:

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