>uso sql server versione 2005 e ho visto che sono presenti solo
>i tipi datetime e smalldatetime.
Esatto.
>Devo fare confronti tra 2 dati smalldatetime, dove 1 è il valore
>che passo io in formato dd/mm/aaaa
Stop. Un valore smalldatetime NON HA FORMATO dato che internamente vengono utilizzate due coppie di interi per rappresentare la parte data e quella oraria.
Se invece di passare un valore smalldatetime vuoi passare una stringa, l'unico formato che ti suggerisco di utilizzare è quello ANSI SQL 'YYYYMMDD' senza alcun separatore dato che è l'unico indipendente da qualsiasi formattazione internazionale e che quindi non da adito a fraintendimenti (leggi valori errati o errori di sintassi).
>e che quindi sql server mette
>di default 00:00:00, mentre l'altro valore con cui devo fare
>il confronto lo prendo dal db.
>Il problema è che il valore che sta sul db non ha il tempo 00:00:00,
>ma un orario.
>Allora visto che non ancora esiste il tipo di dati date SS2005,
>volevo ovviare azzerando il time che prendo dal db, così da confrontare
>2 valori che hanno il tempo uguale, vale a dire come se stessi
>controllando solo le date.
>Spero di essere stato un po' chiaro :)
Osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.Orders(
OrderID int NOT NULL PRIMARY KEY,
OrderDate smalldatetime NOT NULL
);
INSERT dbo.Orders VALUES(1, '20080101 12:35');
INSERT dbo.Orders VALUES(2, '20080101 21:24');
INSERT dbo.Orders VALUES(3, '20080102 17:03');
INSERT dbo.Orders VALUES(4, '20080103 11:59');
GO
CREATE PROCEDURE dbo.up_GetOrders(
@Date smalldatetime
)
AS
DECLARE @From smalldatetime;
DECLARE @To smalldatetime;
SET @From = DATEADD(day, DATEDIFF(day, 0, @Date), 0);
SET @To = @From + 1;
SELECT *
FROM dbo.Orders
WHERE OrderDate >= @From
AND OrderDate < @To;
GO
EXEC dbo.up_GetOrders '20080101 12:35';
/* Output:
OrderID OrderDate
----------- -----------------------
1 2008-01-01 12:35:00
2 2008-01-01 21:24:00
(2 row(s) affected)
*/
EXEC dbo.up_GetOrders '20080102';
/* Output:
OrderID OrderDate
----------- -----------------------
3 2008-01-02 17:03:00
(1 row(s) affected)
*/
DROP PROCEDURE dbo.up_GetOrders;
DROP TABLE dbo.Orders;
Come puoi notare, ho scritto una stored procedure che accetta in input un parametro smalldatetime.
Nel body vado a valorizzare le variabili locali @From e @To rispettivamente con la data passata come argomento senza informazione oraria ed il giorno successivo.
A questo punto recupero tutti gli ordini compresi tra le 00:00 e le 23:59 del giorno in esame.
In particolare la riga:
SET @From = DATEADD(day, DATEDIFF(day, 0, @Date), 0);
non fa altro che eseguire la differenza in giorni tra la data passata come argomento e la base date (01 gennaio 1900) e sommando questo valore alla base date stessa, eliminando quindi l'informazione oraria.
>Grazie ancora!
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org