Confronto e recupero di valori da date su db

venerdì 31 ottobre 2008 - 12.47

stuzzo Profilo | Junior Member

Ciao a tutti!
Volevo chiedervi una cosa. Ho una tabella in cui le date sono di tipo long, cioè oltre la data dd/mm/yyyy è asssociato il timestamp.
Siccome ho diverse stored procedure che effettuano confronti con questi tipi di date, mi sapete dire come faccio da sqlserver a recuperare la data in formato short? In poche parole io passo alla stored procedure passo una data del tipo dd/mm/yyyy e vorrei che facesse il confronto con la data presente sulla tabellam alla quale ovviamente deve essere tolto il timestamp, altrimenti i risultati vengono modificati.
Vi ringrazio

Alfredo Aiello

iif Profilo | Expert

Prova ad utilizzare la funzione convert

stuzzo Profilo | Junior Member

>Prova ad utilizzare la funzione convert

potresti darmi un esempio, te ne sarei molto grato.
Alfredo Aiello

iif Profilo | Expert

CONVERT(SMALLDATETIME, TUADATA)

stuzzo Profilo | Junior Member

>CONVERT(SMALLDATETIME, TUADATA)

mi dispiace, ma non funziona, mi ritorna sempre il tempo. a me serve solo la data
forse ho trovato una guida che può aiutarmi, se risolvo, posto la soluzione

iif Profilo | Expert

E allora prova con Left() e ti estrai la data partendo da sinistra.

stuzzo Profilo | Junior Member

Diciamo che ho leggermente risolto così
select convert(char(10), datainserimento, 103) per farmi ridare la data in maniera dd/mm/aaaa, ma il fatto è che il valore restituito è un char, mentre a me serve una data!!! in quanto devo fare un confronto con un'altra data, non posso credere che sqlserver non abbia un tipo di dati date che rappresenti la data soltanto senza il tempo, visto che ho trovato che come tipo di dati sqlserver ha solo datetime e smalldatetime!!!!!
ditemi che ho sbagliato a cercare!!! :)
Alfredo Aiello

stuzzo Profilo | Junior Member

Come faccio ad azzerare il tempo? c'è una funzione che lo fa direttamente? Dico questo perchè passando uno smalldatetime che ha solo la data, sqlserver imposta l'orario a 00:00:00 di default, quindi per avere un confronto corretto basterebbe convertire a 00:00:00 il valore preso dal db.
Come si fa?
grazie

Alfredo Aiello

lbenaglia Profilo | Guru

>Come faccio ad azzerare il tempo? c'è una funzione che lo fa
>direttamente? Dico questo perchè passando uno smalldatetime che
>ha solo la data, sqlserver imposta l'orario a 00:00:00 di default,
>quindi per avere un confronto corretto basterebbe convertire
>a 00:00:00 il valore preso dal db.
>Come si fa?

Ciao Alfredo,

SQL Server ha introdotto i data type Date e Time solo a partire dalla versione 2008.
Ora, ti chiedo di riassumere brevemente le tue esigenze per capire la situazione attuale ed il risultato che vorresti ottenere.

>grazie
Prego.

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

stuzzo Profilo | Junior Member

Riassumo tutto:
uso sql server versione 2005 e ho visto che sono presenti solo i tipi datetime e smalldatetime.
Devo fare confronti tra 2 dati smalldatetime, dove 1 è il valore che passo io in formato dd/mm/aaaa 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 :)

Grazie ancora!

Alfredo Aiello

lbenaglia Profilo | Guru

>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

stuzzo Profilo | Junior Member

Ciao, penso di aver risolto utilizzando una versione modificata :), nel senso che io dovevo trovare dei record all'interno di un range di tempo, allora ho fatto lo stesso lavoro (quello da te proposto) per entrambe, ovviamente della data minore ho preso il @From, mentre della data maggiore ho preso il @To, quindi ho cercato il valore all'interno del @From di una e il @To dell'altra
Grazie mille :)
Alfredo Aiello
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