[PHP + MS SQL] Unix timestamp maken met MS SQL trigger

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben momenteel bezig met een applicatie waar ik gebruik maak van PHP en een Microsoft SQL Server DB.

Ik heb een tabel met personeelsleden:

personeel_id, achternaam, voornaam, record_update

In de laatste kolom wordt bijgehouden wanneer een record voor het laatst is gewijzigd. Dit doe ik door middel van een Trigger welke aan de tabel hangt en uitgevoerd wordt bij een UPDATE of INSERT;

Volgende trigger heb ik getest:

code:
1
2
3
4
5
6
7
8
9
CREATE TRIGGER [test1] ON [dbo].[personeel] 
FOR INSERT, UPDATE
AS 
UPDATE [LIP].[dbo].[personeel] 

SET   [personeel_id]  = GETDATE()-1

WHERE 
    ( [personeel_id]     = 5)



De huidige datum en tijd worden dan weggeschreven als:

mei 17 2004 10:30AM


Dit is echter niet precies wat ik wil. In de PHP-applicatie wordt gebruik gemaakt van Unix-timestamps (numeriek). Ik wil het daarom voor elkaar zien te krijgen dat in deze trigger een timestamp wordt gegenereed welke ik direct kan gebruiken in de PHP-applicatie. Dit blijkt echter niet zo makkelijk te zijn.

Jullie hulp hierbij is daarom erg welkom. _/-\o_

Alvast bedankt !

P.S. Ik ben gewend om met MySQL te werken en heb ervaring met Oracle SQL maar ben echter nog een newbie bij MS SQL!

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een UNIX timestamp kun je eenvoudig simuleren door
code:
1
SELECT DATEDIFF(s,'01-01-1970',DeDatumKolom) as UNIXTimeStamp


zo kun je gewoon deze datum houden.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
SQL Server heeft ook een timestamp datatype, en als ik me goed herinner, wordt zo'n veld automatisch door SQL Server ingevuld / ge-updated bij wijzigingen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 18 mei 2004 @ 10:51:
SQL Server heeft ook een timestamp datatype, en als ik me goed herinner, wordt zo'n veld automatisch door SQL Server ingevuld / ge-updated bij wijzigingen.
dat is een binair (8 ) getal, en niet een UNIX timestamp

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Ja, maar zo'n timestamp gebruik je imo toch enkel maar omwille van concurrency redenen, dus denk ik toch dat die 'built-in' oplossing beter is dan dat je iedere keer zelf de datetime gaat gaan updaten. (Tenzij je natuurlijk die datum/tijd voor auditting wilt gebruiken)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
P_de_B schreef op 18 mei 2004 @ 10:42:
Een UNIX timestamp kun je eenvoudig simuleren door
code:
1
SELECT DATEDIFF(s,'01-01-1970',DeDatumKolom) as UNIXTimeStamp


zo kun je gewoon deze datum houden.
Klinkt veelbelovend, krijg echter nu de volgende melding:

Warning: mssql_query(): message: Syntax error converting datetime from character string. (severity 16) in D:\LIP\www\secure\consultants_search_iframe.php on line 139

Wat gaat hier mis:

DATEDIFF(s,'01-01-1970',recordupdate)

"recordupdate" is een varchar veld met de waarde: mei 17 2004 10:37AM

[ Voor 4% gewijzigd door Verwijderd op 18-05-2004 11:06 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Euh? Waarom sla je een datum/tijd op in een string? Dat zorgt alleen maar voor miserie. Wat als je een bewerking op die datum moet uitvoeren ? etc....

Ik begrijp niet dat mensen niet altijd de juiste keuzes maken voor hun data-types....

(Je kan mbhv een CONVERT statement die string naar een datum omzetten).
code:
1
SELECT CONVERT(datetime, '01-01-1970')

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op 18 mei 2004 @ 11:06:
Euh? Waarom sla je een datum/tijd op in een string? Dat zorgt alleen maar voor miserie. Wat als je een bewerking op die datum moet uitvoeren ? etc....

Ik begrijp niet dat mensen niet altijd de juiste keuzes maken voor hun data-types....

(Je kan mbhv een CONVERT statement die string naar een datum omzetten).
code:
1
SELECT CONVERT(datetime, '01-01-1970')
Zoals ik al eerder vertelde: wannahelp is een newbie bij MS SQL!

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Verwijderd schreef op 18 mei 2004 @ 11:08:
[...]


Zoals ik al eerder vertelde: wannahelp is een newbie bij MS SQL!
Dat heeft niets met een newbie zijn te maken in SQL Server. In Oracle / MySQL ga je toch ook geen datum opslaan in een varchar veld?
Wat waren je beweegredenen hiertoe?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 18 mei 2004 @ 10:56:
(Tenzij je natuurlijk die datum/tijd voor auditting wilt gebruiken)
Daar ging ik van uit.
Persoonlijk zou ik dat geval een gewone datetime bewaren en als ik in de client app een UNIX timestamp nodig had deze selecten zoals ik heb aangegeven.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 18 mei 2004 @ 11:09:
[...]

Wat waren je beweegredenen hiertoe?
Wat ze ook waren, je moet het veranderen!

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op 18 mei 2004 @ 11:09:
[...]


Dat heeft niets met een newbie zijn te maken in SQL Server. In Oracle / MySQL ga je toch ook geen datum opslaan in een varchar veld?
Wat waren je beweegredenen hiertoe?
Tijdens het testen van de trigger heb ik diverse datatypes geprobeert om de datum even weg te kunnen schrijven. Na wat testen, problemen oplossen etc, had ik een varchar veld waar de datum als string in geplaatst was. Was dus niet zozeer een bewuste keuze.

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik raad je aan om niet onnodig databasenamen op te nemen in je queries. Dus ipv
code:
1
2
3
4
5
UPDATE [LIP].[dbo].[personeel]

kun je bijna altijd beter het volgende doen:

UPDATE [dbo].[personeel]


Verder sluit ik me aan bij P_de_B en whoami.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb nu type datetime met de waarde: 17-5-2004 11:15:09

SQL is als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
  p.*, 
  (SELECT SUM(o.inzet) FROM $MSSQL_opdrachten o WHERE o.personeel_id=p.personeel_id) AS inzet, 
  DATEDIFF(s'01-01-1970',recordupdate) AS UNIXTimeStamp, 
  b.naam bu_naam 
FROM 
  $MSSQL_personeel p, 
  $MSSQL_team t, 
  $MSSQL_bu b 
WHERE 
  p.active=1
  AND p.functie != 'Associate Director'
  AND p.functie != 'Managing Director'
  AND t.team_id=p.team_id 
  AND b.bu_id=t.bu_id 
ORDER BY 
  $order_by


Error:

Warning: mssql_query(): message: Line 1: Incorrect syntax near '01-01-1970'. (severity 15) in D:\LIP\www\secure\consultants_search_iframe.php on line 139

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
er mist een komma na de s in de datediff functie

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
P_de_B schreef op 18 mei 2004 @ 11:21:
er mist een komma na de s in de datediff functie
A stom!!!

Txs voor alle hulp!

Het werkt nu!

Acties:
  • 0 Henk 'm!

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 29-05 01:29
Verwijderd schreef op 18 mei 2004 @ 10:34:
Volgende trigger heb ik getest:

code:
1
2
3
4
5
6
7
8
9
CREATE TRIGGER [test1] ON [dbo].[personeel] 
FOR INSERT, UPDATE
AS 
UPDATE [LIP].[dbo].[personeel] 

SET   [personeel_id]  = GETDATE()-1

WHERE 
    ( [personeel_id]     = 5)
a) BOL
b) je trigger klopt van geen kanten, hopelijk is het gewoon snel in elkaar getypt en niet een copy paste actie van je werkelijke trigger.

je zet een personeel_id met huidige datum minus 1 dag?! waar het personeel_id hardcoded nog in de trigger staat?!

beter is dan:

code:
1
2
3
declare @id int

select @id = personeels_id from inserted

en dan die @id hergebruiken in je trigger code..

(en nee, ook niet gebruik maken van @@last_inserted ofzoiets... rampzalig met gelijktijdige updates).

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
komakeef schreef op 18 mei 2004 @ 11:38:
code:
1
2
3
declare @id int

select @id = personeels_id from inserted

en dan die @id hergebruiken in je trigger code..

(en nee, ook niet gebruik maken van @@last_inserted ofzoiets... rampzalig met gelijktijdige updates).
Dit lijkt me anders ook niet zo'n verstandige oplossing. Stel dat er meer dan één record tegelijk wordt toegevoegd/gewijzigd. Dan is dit ook iets waar je niets mee opschiet.
En MSSQL heeft hele mooie functionaliteit om het laatste door jezelf toegevoegde record terug te vinden, maar dat is hier totaal niet relevant, omdat alle gewijzigde records gewoon in de inserted tabel staan.

@TS: In je select query valt me op, dat je gebruikt maakt van een correlated subquery en dat is over het algemeen niet zo goed voor de performance.
Verder snap ik ook niet wat je met een datum in een personeel_id wilt.
Het lijkt me dat je zoiets nodig hebt:
code:
1
2
3
4
5
6
7
CREATE TRIGGER dbo.[test1] ON [dbo].[personeel] 
FOR INSERT, UPDATE
AS 
UPDATE dbo.personeel
SET   datum = GETDATE()
FROM dbo.personeel p
WHERE (p.personeel_id in (select personeel_id from inserted))

[ Voor 26% gewijzigd door cameodski op 18-05-2004 12:02 ]

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
MAW, je joined dus beter op de inserted tabel:

code:
1
2
3
4
UPDATE blaat
SET veld = waarde
FROM inserted
WHERE inserted.personeels_id = blaat.personeelsid

https://fgheysels.github.io/

Pagina: 1