sql - 提取(从 'Now' 开始的一周)错误

标签 sql firebird firebird2.5

我在我的 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' 将产生当前日期/时间。它在这种情况下不起作用,因为 Firebird 不知道它需要三种类型中的哪一种;理论上 extract 接受任何类型,它实际能做什么取决于它接收的类型。

您需要明确地将其强制转换为日期(或时间戳):

  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)
    

关于sql - 提取(从 'Now' 开始的一周)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196772/

相关文章:

mysql - SQL 中总是需要 ID 列吗?

mysql - 查找列名与给定模式匹配的表

delphi - 修剪字符字段

firebird - 使用 isql 对 firebird 数据库运行多个插入查询

delphi - Firedac select 与 Firebird 一起使用不返回任何记录

sql - 在事件表上更新 id 列的标识规范

sql - Firebird SQL : query slow due to coalesce or can it be rewritten

docker - 如何使用 docker 文件路径连接到 firebird 的 docker 镜像?

sql - 如何在 Firebird 2.5 中 select 语句的 where 子句中转义单引号

MySql 基本表创建/处理