I'm working with a Firebird 2.5 database and need a way to count weekdays within a month. To achieve this, I wanted to create a stored procedure:
CREATE PROCEDURE GetWorkingDays (Start_Date DATE, End_Date DATE)
RETURNS (Working_Days INTEGER)
AS
BEGIN
Working_Days = 0;
WHILE (Start_Date <= End_Date) DO
BEGIN
IF ((EXTRACT(WEEKDAY FROM Start_Date) NOT IN (0, 6))) THEN
BEGIN
Working_Days = Working_Days + 1;
END
Start_Date = Start_Date + 1;
END
SUSPEND;
END
Unfortunately, I'm encountering the following error and I'm not sure how to proceed. Can anyone help?
Error: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -817
Metadata update statement is not allowed by the current database SQL dialect 1
SQLState: 42000
ErrorCode: 335544569
The problem is that you're currently connecting to a dialect 1 database with a dialect 3 connection, or using a driver that prepares statements as dialect 3, even when using a dialect 1 connection.
The dialect 1
DATEdata type is actually a date+time, and was renamed toTIMESTAMPin dialect 3 (to match the SQL standard name). The dialect 3DATEis a date only, which doesn't exist in dialect 1. This is what causes the error.There are two possible options:
DATEwithTIMESTAMPin your script.That said, dialect 1 was deprecated 25 years ago in InterBase 6.0, and you should not be using it. You need to upgrade your database to dialect 3. The InterBase 6.0 Getting Started Guide (available from https://firebirdsql.org/en/reference-manuals/ under "InterBase 6.0 Manuals" in the "Full set, cross-referenced") provides instructions how to upgrade.