solaris-ch
Goto Top

MSSQL Records zwischen Gestern Mitternacht und Heute Mitternacht

MSSQL 2003

Hallo liebe Admins!

Wieder einmal ich, und wieder einmal ein MSSQL Problem...

Wir wollen eine Table von einem MSSQL System auf ein MySQL System spiegeln. Einmal am Tag.
Nun wollen wir dies via einem in der MSSQL Table vorhandenen Timestamp realisieren.

Alle Records, welche zwischen Gestern 00:00:00 und Heute 00:00:00 in der Tabelle sind, sollen in ein Textfile geschrieben werden, welches dann importiert wird. Das mit dem Textfile ist auch eine Zangengeburt, geht aber mittlerweile. Nur das Selektieren der Records gelingt uns nicht.

Beispiel:

(Pseudo Code)

SELECT *
FROM
db.user.tbl
WHERE
TimeStamp BETWEEN '2008-09-17 00:00:00' and '2008-09-18 00:00:00'

Anders, vielleicht einfacher ausgedrückt:
Wir wollen alle Records eines Tages.
Und zwar vom vergangenen Tag.
Keine Records vom aktuellen Tag.
face-wink
Und genau dort hängts bei uns... jemand ne Idee?

Besten Dank für Eure Hilfe!

Content-ID: 97282

Url: https://administrator.de/contentid/97282

Ausgedruckt am: 15.11.2024 um 23:11 Uhr

Biber
Biber 18.09.2008 um 16:49:31 Uhr
Goto Top
Moin solaris-ch,

ich habe eigentlich im moment nur zwei Probleme.
- ich verstehe Deine Frage/Dein problem nicht wirklich
- und ich spreche kein mySQL
... aber in der Tendenz würder ich es so abfackeln, bis mir etwas ästhetisches einfällt:
SELECT deitab.*
FROM
db.user.tbl deitab
WHERE
 Date(deitab,DeinTimeStamp) = Date_ADD(CURDATE(), INTERVAL -1 DAY)

---> Date(DeinTimeStamp) sollte die Uhrzeit-Detailangabe aus dem Timestamp entfernen
---> CurDate() liefert nur Datum "heute" ohne Uhrzeit
--> "heute" abzüglich 1 Tach sollte "gestern" ebenfallls im Format ohne Uhrzeit liefern.

Grüße
Biber
solaris-ch
solaris-ch 18.09.2008 um 16:55:56 Uhr
Goto Top
Hi Biber!

Du hast mich effektiv nicht verstanden face-wink

Ich suche nicht den Code für mYsql, sondern für mSsql...
Bei MSSQL gibts kein CURDATE, INTERVAL geht so auch nicht...

In MySQL wüsste ich auch wie ich das Problem lösen kann. Aber eben nicht so in MSSQL...
Und ich muss die Daten aus MSSQL raus spoolen.

Gruss
36831
36831 18.09.2008 um 17:31:01 Uhr
Goto Top
Moin,

du kannst doch, wie in Excel, mit größer als (>) und kleiner als (<) arbeiten, oder?

Dann wäre dein Statement von oben in etwa:
SELECT *
FROM
db.user.tbl
WHERE
TimeStamp > '2008-09-17 00:00:00' AND TimeStamp < '2008-09-18 00:00:00'  

Ich kann dir allerdings so nicht sagen, in welchem Format du den Timestamp ansprechen musst, da ich außer in einer (qualitativ nicht so hochwertigen) Schulung noch kein MSSQL angewendet habe.

Habe nur SQL-Erfahrung aus Firebird-Datenbanken. Und das auch nur aus der Schule aus dem Unterricht.

MfG,
VW
bastla
bastla 18.09.2008 um 21:08:20 Uhr
Goto Top
Hallo solaris-ch!

Vielleicht so:
WHERE CONVERT(VARCHAR(8), TimeStamp, 112) = CONVERT(VARCHAR(8), GETDATE() - 1, 112)
Grüße
bastla
Biber
Biber 18.09.2008 um 22:20:04 Uhr
Goto Top
Moin solaris-ch,

In den MSDN-BOL steht:
The SQL-2003 timestamp data type is equivalent to the Transact-SQL datetime data type.

demnach sollte bastlas CASTerei funktionieren.

Grüße
Biber
solaris-ch
solaris-ch 19.09.2008 um 09:00:52 Uhr
Goto Top
Hi Bastla

besten Dank für deine Hilfe! Dieser Weg funktioniert... wenn auch mit enormen Performance - Gelüsten aufgrund des Casterei.

Vielen Dank!
MadMax
MadMax 19.09.2008 um 13:15:02 Uhr
Goto Top
Moin solaris-ch,

das Thema ist zwar als erledigt markiert, aber hier noch ein Hinweis, wie Du die "enormen Performance - Gelüste" etwas einschränken kannst. Die liegen nämlich nicht an den Converts an sich, sondern speziell an dem Convert auf den Timestamp. Wenn also nur die Vergleichswerte konvertiert werden, geht es schneller. Das kann dann etwa so aussehen:
declare @Datum datetime
select @Datum = convert (datetime, convert (varchar (20), getdate (), 112), 112)
select * from db.user.tbl
where TimeStamp >= dateadd (d, -1, @Datum) and TimeStamp < @Datum

Gruß, Mad Max
solaris-ch
solaris-ch 19.09.2008 um 13:32:34 Uhr
Goto Top
Das geht ja echt fix! Besten Dank! Ist mindestens 10 mal schneller wie die erste Variante!

Vielen Dank an dich!

Gruss
bastla
bastla 19.09.2008 um 13:40:09 Uhr
Goto Top
Hallo Mad Max!

Hast natürlich völlig recht ... face-smile

Vielleicht noch effizienter:
declare @Datum datetime
declare @Datum1 datetime
select @Datum = convert (datetime, convert (varchar (20), getdate (), 112), 112)
select @Datum1 = dateadd (d, -1, @Datum)
select * from db.user.tbl
where TimeStamp >= @Datum1 and TimeStamp < @Datum
Grüße
bastla