Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Datum (https://www.delphipraxis.net/175958-sql-datum.html)

Metallicwar 2. Aug 2013 09:15

Datenbank: ADS • Version: 10.10 • Zugriff über: Delphi

SQL Datum
 
Moin,
ich baue mir aus einem Monat und einem Jahr ein Datum zusammen.

Code:
SELECT CAST('01.'+IIF(Length(TRIM(CAST(7 as SQL_Char)))= 1, '0'+TRIM(CAST(7 as SQL_CHAR)), CAST(7 as SQL_Char))+'.'+CAST(2013 as SQL_Char) as SQL_Date) FROM System.iota
So funktioniert es.
Problem ist jetzt aber, dass ich nicht mehr den ersten des Monats brauche sondern den letzten.
Dazu habe ich mir eine Funktion geschrieben, die mir aus dem übergebenem Monat und Jahr den letzten Tag zurückliefert.

Code:
CREATE FUNCTION ZMIF.GetLastDayOfMonth
   ( 
   Year INTEGER,
      Month INTEGER
   )
   RETURNS INTEGER
BEGIN
Return DAYOFMONTH(CONVERT(TIMESTAMPADD(SQL_TSI_DAY, -1, TIMESTAMPADD( SQL_TSI_MONTH, 1, CREATETIMESTAMP( Year, Month, 1, 0, 0, 0, 0 ))), SQL_DATE));

END;
Die Funktion baue ich in mein SQL Statement ein und caste den Integer in eine Character.
Code:
SELECT CAST(CAST(GetLastDayOfMonth(2013, 7) as SQL_Char)+'.'+IIF(Length(TRIM(CAST(7 as SQL_Char)))= 1, '0'+TRIM(CAST(7 as SQL_CHAR)), CAST(7 as SQL_Char))+'.'+CAST(2013 as SQL_Char) as SQL_Date) FROM System.iota
Fehlermeldung ADS:
Zitat:

Conversion error with scalar
CAST -- Location of error in the SQL statement is: 9 (line: 2 column: 8)

jobo 2. Aug 2013 09:41

AW: SQL Datum
 
Das sollte mit serverseitigen Funktionen gehen.
TIMESTAMPDIFF, -ADD

http://devzone.advantagedatabase.com..._functions.htm

Metallicwar 2. Aug 2013 09:57

AW: SQL Datum
 
Hi jobo,
danke für deine Antwort.
Das hab ich auch schonmal gefunden.
Ich würde trotzdem gerne wissen, wie ich das auf meinen Weg lösen kann :-)
Möchte ungern meinen ganzen SQL's umbauen.

Gruß

Union 2. Aug 2013 11:09

AW: SQL Datum
 
Also erstmal verwendest Du ein Client-Format für das Datum. Das ist nicht so gut. Da würde ich als erstes suchen, also nicht DD.MM.YYYY sondern YYYY-MM-DD.

Zweitens solltest Du JEDEN Cast von Integer nach Char mit TRIM einschließen. Und dann das ganze vielleicht noch lesbarer machen. Unabhängig davon dass es da bessere Methoden gibt, würde dies dann so funktionieren:
Code:
SELECT CAST(
         TRIM(CAST(2013 as SQL_Char))
       +'-'+
        IIF(Length(TRIM(CAST(7 as SQL_Char)))= 1,
         '0'+TRIM(CAST(7 as SQL_CHAR)),      -- IF
        TRIM(CAST(7 as SQL_Char)))          -- ELSE
       +'-'+
       TRIM(CAST(31 as SQL_Char))
      AS SQL_DATE)
FROM System.iota

Metallicwar 2. Aug 2013 11:44

AW: SQL Datum
 
Super, das funktioniert.
Vielen dank.
Wie könnte ich das ganze denn auch mit weniger Code lösen (http://devzone.advantagedatabase.com..._functions.htm)

Union 2. Aug 2013 12:04

AW: SQL Datum
 
Verwende doch das bereits in der User defined funktion verwendete Skalar, z.b.:
Code:
select cast(CreateTimeStamp(2013, 07, 31, 0, 0, 0, 0) as SQL_DATE) from system.iota
Laut Deiner Infos setzt Du ja Advantage 10.1 ein, dort gibt es ja diese Funktion bereits. Du hattest auf die Hilfe der Version 8 verlinkt.

Metallicwar 2. Aug 2013 12:35

AW: SQL Datum
 
Ich werde doch alle SQL's umbauen, da erspar ich mir einiges an Code .
Besten Dank.
Schönes Wochenende !!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz