Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011 (https://www.delphipraxis.net/172966-sql-server-datepart-m-%3D-12-yyyy-%3D-2012-bringt-daten-aus-2011-a.html)

süden 30. Jan 2013 18:36

Datenbank: MS SQL-Server • Version: 2008 • Zugriff über: Delphi ADO

SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Hallo,
ich krieg's nicht gebacken.

Ich habe Datumswerte als Integer abgespeichert,
wenn ich nun die:

"SELECT * FROM tStunden
WHERE (MitarbeiterID = '004')
AND (DatePart("m", DATE) = 12)
AND (DatePart("yyyy", DATE) = 2012)" absetze,

Bekomme ich Werte aus 12/2011.

Ich arbeite zum 1. mal mit SQL-Server - natürlich unter Termindruck - und kann mir das nicht erklären.
In Access hat es immer funktioniert.

Gruß 'süden'

DeddyH 30. Jan 2013 18:39

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Du hast ein Datum in einem Integer-Feld mit Namen Date abgelegt?

haentschman 30. Jan 2013 18:40

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Hallo...

da hätten wir mal wieder den Hinweis mit Parametern zu arbeiten. Da es warscheinlich diese Aggregatfunktion nicht gibt, wäre dann die Möglichkeit gegeben, die Werte für den Datumspart vorher zu extrahieren und vernünftig als Parameter zu übergeben.

:hi:

Nachtrag: übersehen, daß in dem Feld das komplette Datum steht... :oops: Ich wollte halt mal schneller als DeddyH sein... 2x Nix :evil:

süden 30. Jan 2013 18:54

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Du hast ein Datum in einem Integer-Feld mit Namen Date abgelegt?

Jau, aber nicht ich (würde ich doch niemals tun!!!).
Es ist ein altes Programm, ziemlich umfangreich, Zeitdruck usw.
ich bringe es auf SQL-Server, die DB soll unverändert bleiben.

Das DATE ist aber geklammert = [DATE], aber trotzdem sollte es laufen.
Datum im Integer finde ich gut, ist ja sowieso ein Double. Datum, Stunden und Minuten werden separat eingegeben und berechnet, dann macht es Sinn, oder nicht?

Aber das Phänomen bleibt. Da rechnet was ziemlich falsch.

Gruß 'süden'

süden 30. Jan 2013 18:57

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Nachtrag:

Wenn ich die Integerwerte in die Abfrage einsetze (Between 41123 AND 41234) geht es wunderbar.
Aber wie komme ich jetzt schnellstens an die dran für:
diesen Monat, letzten Monat, ... EncodeDate usw., klar.

DeddyH 30. Jan 2013 18:59

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Ich kenne mich nicht so wahnsinnig gut mit MSSQL aus, aber bringt ein expliziter Cast evtl. etwas?
SQL-Code:
AND (DatePart("m", CAST([DATE] AS DATE)) = 12)

generic 31. Jan 2013 09:15

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Alternativ zum DatePart() lässt sich auch Month() und Year() nutzen.
Setzt aber auch ein Datetime Feld in der DB vor raus.

süden 31. Jan 2013 12:10

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Zusatzinformation:

Es soll auch weiterhin mit einer Access-DB laufen.
Natürlich geht das nicht ohne Anpassung, sollte aber im Rahmen bleiben.

Was mich wundert ist, dass die DB schon den Monat rausschmeißt, die Abfrage also läuft, aber zusätzlich noch 2 - 3 Tage aus dem vergangenen Monat - trotz der eindeutigen Angaben - "m" = 12, "yyyy" = 2012.

Gruß 'süden'

p80286 31. Jan 2013 12:19

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Könnte es sein, daß dieses Verhalten dem nicht definierten Tag geschuldet ist?

Gruß
K-H

sx2008 31. Jan 2013 12:30

AW: SQL-Server DatePart "m" = 12 + "yyyy" = 2012 bringt Daten aus 2011
 
Man kann das auch anderst lösen:
Delphi-Quellcode:
jahr := 2012;
monat := 12;
ADOQuery1.SQL.Text := 'SELECT * FROM tStunden'#13#10+
'WHERE (MitarbeiterID = :MitarbeiterID)'#13#10+
'AND [DATE] >= :datevon AND [DATE] < :datebis';
ADOQuery1.Parameters.ParamValues['MitarbeiterID'] := '004';
ADOQuery1.Parameters.ParamValues['datevon'] := EncodeDate(jahr,monat,1);
Inc(monat);
if monat > 12 then begin monat := 1; Inc(jahr); end;
ADOQuery1.Parameters.ParamValues['datebis'] := EncodeDate(jahr {=2013},monat {=1},1);
ADOQuery1.Open;
Diese Vorgehensweise hat den Vorteil, dass man auch andere Zeitintervalle als nur einen Monat angeben kann.
Man beachte, dass der 1.1.2013 nicht in den Daten enthalten ist; der Zeitpunktt 31.12.2012 23:59:59 aber schon.
Dies funktioniert ohne Änderungen für MSAccess als auch für MS SQL Server 7/2000/2005/2008/2012.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 Uhr.

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