Ancora sulle date...

giovedì 29 giugno 2006 - 11.11

bluland Profilo | Guru

salve ecco il quesito:

ho una tabella dove ci sono 2 campi data, (data1 e data2), vorrei che al momento dell'inserimento il campo data1 venisse automanticamente riempito con la data di sistema e per questo ho usato getdate() come default value, inoltre in questo primo inserimento data2 deve rimanere vuoto. In un secondo momento solo il campo data2 deve essere riempito sempre pero' con la data di sistema, il problema e' che se imposto anche data2 con getdate(), questo si riempira' gia' al primo inserimento mentre io vorrei che al secondo inserimento/modifica si riempia restando uguali il resto dei campi.
spero di essermi spiegato..

qualche idea?

saluti ENzo

alx_81 Profilo | Guru

Ciao!
se intendi il secondo inserimento (e terzo e quarto e così via) dovresti farlo applicativamente.. un update dedicata solo sul campo data2, dove il parametro del data2 sarà un data.now..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>ho una tabella dove ci sono 2 campi data, (data1 e data2), vorrei
>che al momento dell'inserimento il campo data1 venisse automanticamente
>riempito con la data di sistema e per questo ho usato getdate()
>come default value, inoltre in questo primo inserimento data2
>deve rimanere vuoto. In un secondo momento solo il campo data2
>deve essere riempito sempre pero' con la data di sistema, il
>problema e' che se imposto anche data2 con getdate(), questo
>si riempira' gia' al primo inserimento...

Quello che tu hai definito in data1 non è altro che un constraint DEFAULT.
Questo constraint entra in causa quando esegui il comando INSERT nel caso non abbia specificato in modo esplicito un valore per quella colonna.
Ad ogni successiva modifica il constraint non ha più alcun effetto.

>...mentre io vorrei che al
>secondo inserimento/modifica si riempia restando uguali il resto
>dei campi.

Non esiste alcun secondo inserimento, al più una modifica (UPDATE/DELETE).
Se data2 deve contenere la data di modifica della riga, puoi utilizzare un trigger:

USE tempdb GO /* Creo la tabella dbo.Students */ CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, DateInserted datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, DateModify datetime NULL ); GO /* Definisco il trigger dbo.tr_StudentsSetLastModify */ CREATE TRIGGER dbo.tr_StudentsSetLastModify ON dbo.Students FOR UPDATE AS UPDATE dbo.Students SET DateModify = CURRENT_TIMESTAMP FROM dbo.Students S JOIN INSERTED I ON S.StudentID = I.StudentID; GO /* Popolo la tabella */ SET NOCOUNT ON; INSERT dbo.Students(FirstName, LastName) VALUES('Lorenzo', 'Benaglia'); WAITFOR DELAY '000:00:5'; INSERT dbo.Students(FirstName, LastName) VALUES('Luca', 'Bianchi'); WAITFOR DELAY '000:00:8'; INSERT dbo.Students(FirstName, LastName) VALUES('Gianluca', 'Hotz'); SET NOCOUNT OFF; GO /* Vediamo */ SELECT * FROM dbo.Students; GO /* Output: StudentID FirstName LastName DateInserted DateModify ----------- ---------- ---------- ----------------------- ----------------------- 1 Lorenzo Benaglia 2006-06-29 11:52:43.980 NULL 2 Luca Bianchi 2006-06-29 11:52:49.000 NULL 3 Gianluca Hotz 2006-06-29 11:52:57.000 NULL (3 row(s) affected) */ /* Aggiorno tutte le righe della tabella */ UPDATE dbo.Students SET FirstName = 'Pippo'; GO /* Vediamo */ SELECT * FROM dbo.Students; GO /* Output: StudentID FirstName LastName DateInserted DateModify ----------- ---------- ---------- ----------------------- ----------------------- 1 Pippo Benaglia 2006-06-29 11:52:43.980 2006-06-29 11:53:33.187 2 Pippo Bianchi 2006-06-29 11:52:49.000 2006-06-29 11:53:33.187 3 Pippo Hotz 2006-06-29 11:52:57.000 2006-06-29 11:53:33.187 (3 row(s) affected) */ /* Aggiorno solo una riga */ UPDATE dbo.Students SET FirstName = 'Lorenzo' WHERE StudentID = 1; GO /* Vediamo */ SELECT * FROM dbo.Students; GO /* Output: StudentID FirstName LastName DateInserted DateModify ----------- ---------- ---------- ----------------------- ----------------------- 1 Lorenzo Benaglia 2006-06-29 11:52:43.980 2006-06-29 11:54:00.903 2 Pippo Bianchi 2006-06-29 11:52:49.000 2006-06-29 11:53:33.187 3 Pippo Hotz 2006-06-29 11:52:57.000 2006-06-29 11:53:33.187 (3 row(s) affected) */ /* Pulizia */ DROP TABLE dbo.Students;

>saluti ENzo
Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

x lbenaglia: me la studio e ti faccio sapere grazie

x: alex81, il secondo inserimento non e' un problema il fatto che io voglio che anche al secondo inserimento sia inserita nel campo data2 la data di sistema. grazie cmq...

lbenaglia Profilo | Guru

>x lbenaglia: me la studio e ti faccio sapere grazie
>
>x: alex81, il secondo inserimento non e' un problema il fatto
>che io voglio che anche al secondo inserimento sia inserita nel
>campo data2 la data di sistema. grazie cmq...

x bluland: il mio esempio fa proprio questo

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

ok ci sono, non va del tutto bene questa soluzione ti spiego il perche con un esempio:

ho i campi:
prodotto, matricola, data_entrata, data_uscita

faccio l'inserimento e riempio il campo: prodotto, matricola, data_entrata,

poi di questi campi in seguito può capitare anche di fare una modifica, anche se ciò avvenisse il campo data_uscita deve cmq restare vuoto.

il campo data_uscita verrà riempito con la data del sistema solo quando lo si deciderà di riempire, quindi se creo il trigger per update appena faccio una modifica (magari perche ho sbagliato l'inserimento) anche il campo data_uscita si riempira', in effetti questo campo deve solo indicare l'uscita del prodotto e quindi deve essere indipendente dal resto dei campi in un certo senso!!!!
che ne dici idee? spero di essermi spiegato......, forse dovrei fare 2 tabelle separate?? tu che mi consigli?

saluti
Enzo

alx_81 Profilo | Guru

Scusami, ma ribadisco il mio concetto..
quando arriva il momento, fai un update ad hoc, solo sulla data_uscita, passando dall'applicazione che esegue l'inserimento, il Datetime.Now come parametro della query..
Non vedo problemi, forse non capisco io..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>poi di questi campi in seguito può capitare anche di fare una
>modifica, anche se ciò avvenisse il campo data_uscita deve cmq
>restare vuoto.

Tu scrivevi:

"...mentre io vorrei che al
secondo inserimento/modifica si riempia restando uguali il resto
dei campi."

che è ben diverso!
In questo caso lascia perdere i trigger e segui il suggerimento di Alx_81.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

anche io avevo pensato di fare come dice alex81, ma quello mi fa dubitare di questa soluzione è il fatto che il datetime.now prende la data del pc da dove avviene l'evento giusto?? e non quella della macchina server allo stesso modo del getdate o sbaglio??

saluti

Enzo

lbenaglia Profilo | Guru

>anche io avevo pensato di fare come dice alex81, ma quello mi
>fa dubitare di questa soluzione è il fatto che il datetime.now
>prende la data del pc da dove avviene l'evento giusto?? e non
>quella della macchina server allo stesso modo del getdate o sbaglio??

No, non sbagli, ma nessuno ti vieta di eseguire una

UPDATE tabella SET Data2 = CURRENT_TIMESTAMP WHERE...

E verrà utilizzata la data del server, meglio ancora se racchiudi quel codice in una stored procedure parametrica

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

benissimo quindi devo usare CURRENT_TIMESTAMP ? ma scusa la domanda e se usassi
UPDATE tabella
SET Data2 = getdate()
WHERE...

si può fare?? e se si potesse fare che differenza c'è?

grazie molto dell'aiuto

lbenaglia Profilo | Guru

>benissimo quindi devo usare CURRENT_TIMESTAMP ? ma scusa la domanda
>e se usassi
>UPDATE tabella
>SET Data2 = getdate()
>WHERE...
>
>si può fare?? e se si potesse fare che differenza c'è?

GETDATE() è una funzione proprietaria di SQL Server, mentre CURRENT_TIMESTAMP aderisce allo standard ANSI SQL-92, quindi è supportata da tutti i DBMS che contemplano tale standard.

In soldoni non cambia niente, ma è sempre meglio scrivere soluzioni portabili quando è possibile

>grazie molto dell'aiuto
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

esauriente come sempre! mi devo un pò leggere questo ANSI !!!

lbenaglia Profilo | Guru

>esauriente come sempre! mi devo un pò leggere questo ANSI
>!!!
E' solo un vecchio working draft, ma buon divertimento:
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

grazie e buona notte (almeno per non nottambuli)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5