Corso SQL Server

SQL Server lezione #09 Come utilizzare le funzioni

 

Come utilizzare le funzioni

Nella lezione 3 sono state presentate alcune delle funzioni scalari che si possono usare in un'istruzione SELECT. Questa lezione amplia la trattazione presentando molte altre funzioni scalari. Al termine di questa lezione, si avrà una conoscenza approfondita delle funzioni che si possono utilizzare con SQL Server.

Come lavorare con i dati delle stringhe

SQL Server offre una serie di funzioni per lavorare con i dati stringa. Negli argomenti che seguono imparerete a utilizzare alcune di queste funzioni. Inoltre, imparerete come risolvere due problemi comuni che possono verificarsi quando quando si lavora con i dati stringa.

Un riepilogo delle funzioni che consentono la manipolazione delle stringhe

La parte 1 della figura che segue riassume le funzioni di stringa disponibili con SQL Server. La maggior parte di queste funzioni viene utilizzata per eseguire la manipolazione delle stringhe. Ad esempio, è possibile utilizzare la funzione LEN per ottenere il numero di caratteri di una stringa. Si noti che questa funzione conta gli spazi all'inizio della stringa (spazi iniziali), ma non gli spazi alla fine della stringa (spazi finali). Se si desidera rimuovere gli spazi iniziali o finali da una stringa, è possibile utilizzare la funzione LTRIM o RTRIM. È possibile utilizzare le funzioni LEFT e RIGHT per ottenere il numero specificato di caratteri dall'inizio e dalla fine di una stringa. È possibile utilizzare la funzione SUBSTRING per ottenere il numero di caratteri specificato da qualsiasi punto di una stringa. È possibile utilizzare la funzione REPLACE per sostituire una sottostringa all'interno di una stringa con un'altra sottostringa. È possibile utilizzare la funzione REVERSE per invertire l'ordine dei caratteri di una stringa. La funzione CHARINDEX permette di individuare la prima occorrenza di una sottostringa all'interno di un'altra stringa. Il valore restituito è un numero che indica la posizione della sottostringa. È possibile iniziare la ricerca da una posizione diversa dall'inizio della stringa, includendo l'argomento start. La funzione PATINDEX è simile a CHARINDEX. Invece di individuare una stringa, individua un modello di stringa. Come i modelli di stringa appresi nella lezione 3 per l'uso dell'operatore LIKE, i modelli di stringa utilizzati con la funzione PATINDEX possono includere caratteri jolly. Si può fare riferimento alla lezione 3 per rinfrescare la memoria sull'uso di questi caratteri. La funzione CONCAT consente di concatenare due o più valori in un'unica stringa. Questa funzione è simile all'operatore di concatenazione, ma consente di concatenare valori diversi dalle stringhe. A tal fine, converte implicitamente tutti i valori in stringhe. Ciò include i valori nulli, che vengono convertiti in stringhe vuote. Le ultime tre funzioni dovrebbero essere autoesplicative. Si utilizzano le funzioni LOWER e UPPER per convertire i caratteri di una stringa in minuscolo o maiuscolo. La funzione SPACE restituisce una stringa con il numero di spazi specificato.

Alcune funzioni di manipolazione delle stringhe

manipolazione delle stringhe
FunzioneDescrizione
LEN(string)Restituisce il numero di caratteri della stringa. Gli spazi iniziali sono inclusi, ma non gli spazi finali.
LTRIM(string)Restituisce la stringa con gli spazi iniziali rimossi.
RTRIM(string)Restituisce la stringa con la rimozione di tutti gli spazi char(32) o altri caratteri specificati dalla fine di una stringa
LEFT(string,length)Restituisce il numero specificato di caratteri dall'inizio della stringa
RIGHT(string,length)Restituisce il numero di caratteri specificato dalla fine della stringa
SUBSTRING(string,start,length)Restituisce il numero specificato di caratteri a partire dalla posizione specificata
REPLACE(search,find,replace)Restituisce la stringa di ricerca con tutte le occorrenze della stringa sostituite con la stringa di sostituzione
REVERSE(string)Restituisce la stringa con i caratteri in ordine inverso
CHARINDEX(find,search[,start])Restituisce un numero intero che rappresenta la posizione della prima occorrenza della stringa trovata nella stringa di ricerca a partire dalla posizione specificata. Se la posizione iniziale non è specificata, la ricerca inizia dall'inizio della stringa. Se la stringa non viene trovata, la funzione restituisce zero
PATINDEX(find,search)Restituisce un numero intero che rappresenta la posizione della prima occorrenza del modello di ricerca nella stringa di ricerca. Se lo schema non è presente, la funzione restituisce zero. Il modello di ricerca può includere caratteri jolly. Se il modello inizia con un carattere jolly, il valore restituito è la posizione del primo carattere non jolly
CONCAT(valuel,value2[,value3]...)Restituisce una stringa che contiene una concatenazione dei valori specificati. I valori sono implicitamente convertiti in stringhe. Un valore nullo viene convertito in una stringa vuota
LOWER(string)Restituisce la stringa convertita in lettere minuscole
UPPER(string)Restituisce la stringa convertita in lettere maiuscole
SPACE(integer)Restituisce una stringa con il numero di spazi specificato (spazi vuoti)

Note

Esempi delle funzioni di manipolazione delle stringhe

La parte 2 della figura presenta esempi della maggior parte delle funzioni di stringa. Se studiate gli esempi nella parte superiore di questa figura, non dovreste avere problemi a capire come funzionano. Tuttavia, se si è confusi da una di esse, si può fare riferimento alla parte 1 per controllare la sintassi. L'istruzione SELECT mostrata in questa figura illustra come si possono usare le funzioni LEFT e RIGHT per formattare le colonne di un insieme di risultati. In questo caso, la funzione LEFT viene utilizzata per recuperare il primo carattere della colonna VendorContactFName della tabella Vendor, che contiene il nome del contatto del fornitore. In altre parole, questa funzione recupera la prima iniziale del contatto del fornitore. Poi, l'iniziale viene combinata con il cognome del contatto del fornitore e con due valori letterali. Il risultato è visibile nella seconda colonna del set di risultati. La terza colonna del set di risultati elenca il numero di telefono del fornitore senza prefisso. A tale scopo, questa specifica di colonna utilizza la funzione RIGHT per estrarre gli otto caratteri più a destra della colonna VendorPhone. Questo presuppone, ovviamente, che tutti i numeri di telefono siano memorizzati nello stesso formato, ma non è detto che sia così, dato che la colonna VendorPhone è definita come come varchar(50). Questa istruzione SELECT mostra anche come si possa usare una funzione nella condizione di ricerca di una clausola WHERE. Questa condizione utilizza la funzione SUBSTRING per selezionare solo le righe con un prefisso telefonico di 559. A tal fine, la funzione recupera tre caratteri dalla colonna VendorPhone a partire dal secondo carattere. Anche in questo caso, si presuppone che i numeri di telefono siano tutti nello stesso formato e che il prefisso sia racchiuso nella colonna VendorPhone e sia racchiuso tra parentesi.

Esempi di funzioni stringa

Funzioni stringa
FunzioneRisultato
LEN('SQL Server')10
LEN(' SQL Server ')12
LEFT('SQL Server',3)SQL
LTRIM (' SQL Server ' )'SQL Server '
RTRIM (' SQL Server ' )' SQL Server'
LTRIM(RTRIM(' SQL Server '))'SQL Server'
LOWER('SQL Server')'sql server'
UPPER('ca')CA
PATINDEX('%v_r%','SQL Server')8
CHARINDEX('SQL ' , ' SQL Server' )3
CHARINDEX('-','(559) 555-1212')10
SUBSTRING('(559) 555-1212', 7, 8)555-1212
REPLACE(RIGHT('(559) 555-1212', 13), ') ', '-')559-555-1212
CONCAT('Run time: ', 1.52, ' seconds')Run time: 1.52 seconds

Un'istruzione SELECT che utilizza le funzioni LEFT, RIGHT, e le funzioni SUBSTRING

    USE AP
    GO
    Select VendorName, VendorContactLName + ', ' + LEFT(VendorContactFName, 1)
        + '.' AS ContactName, RIGHT(VendorPhone, 8) AS Phone
    FROM Vendors
    WHERE SUBSTRING(VendorPhone, 2, 3) = 559
    ORDER BY VendorName
                

Come risolvere i problemi più comuni che si verificano con i dati delle stringhe

La Figura seguente presenta le soluzioni a due problemi comuni che si presentano quando si lavora con i dati di stringa. Il primo problema si verifica quando si memorizzano dati numerici in una colonna di caratteri e si vuole ordinare la colonna in sequenza numerica. Per illustrarlo, osservate il primo esempio della figura. Qui le colonne della tabella StringSample sono definite con tipi di dati di carattere. La prima istruzione SELECT mostra il risultato dell'ordinamento della tabella in base alla prima colonna, che contiene un ID numerico. Come si può notare, le righe non sono in sequenza numerica. Questo perché SQL Server interpreta i valori come caratteri e non come numeri. Un modo per risolvere questo problema è quello di convertire i valori della colonna ID in interi per l'ordinamento. Questo è illustrato nella seconda istruzione SELECT in questo esempio. Come si può vedere, le righe sono ora ordinate in sequenza numerica. Un altro modo per risolvere questo problema è quello di riempire i numeri con zeri o spazi iniziali, in modo che i numeri siano allineati a destra. Questo è illustrato dalla colonna AltID di questa tabella, che è riempita di zeri. Se si ordina in base a questa colonna invece della prima, le righe verrebbero restituite in sequenza numerica. Il secondo problema che si incontra quando si lavora con i dati di stringa si presenta quando due o più valori sono memorizzati nella stessa stringa. Ad esempio, sia il nome che il cognome sono memorizzati nella colonna Nome della tabella StringSample. Se si vuole lavorare con il nome e il cognome in modo indipendente, è necessario analizzare la stringa con le funzioni utilizzando le funzioni di stringa. Questo è illustrato dall'istruzione SELECT nel secondo esempio di questa figura. Per estrarre il nome, l'istruzione utilizza le funzioni LEFT e CHARINDEX. Innanzitutto, utilizza la funzione CHARINDEX per individuare il primo spazio nella colonna Nome. Quindi utilizza la funzione LEFT per estrarre tutti i caratteri fino a quello spazio. Si noti che uno viene sottratto dal valore restituito dalla funzione CHARINDEX, quindi lo spazio non è incluso nel nome. Per estrarre il cognome, questa istruzione utilizza le funzioni RIGHT, LEN e CHARINDEX. Utilizza la funzione LEN per ottenere il numero di caratteri nella colonna Nome. Quindi, utilizza la funzione CHARINDEX per individuare il primo spazio nella colonna Nome e sottrae questo valore dal valore restituito dalla funzione LEN. Il risultato è il numero di caratteri del cognome. Questo valore viene utilizzato nella funzione RIGHT per estrarre il cognome dalla colonna Nome. Nel rivedere questo esempio, è bene ricordare che l'ho mantenuto semplice, in modo da concentrarsi sull'uso delle funzioni stringa. È necessario rendersi conto, tuttavia, che questo codice non funziona per tutti i nomi. Se, ad esempio, un nome contiene uno spazio, come nel caso del nome Jean Paul, questo codice non funzionerà correttamente. Ciò dimostra l'importanza di progettare un database in modo da evitare questo tipo di problemi. Ne parleremo nella prossima lezione. Per ora, è sufficiente rendersi conto che se un database è progettato in modo corretto, non ci si dovrà preoccupare di questo tipo di problema. Invece, questo problema dovrebbe verificarsi solo se si stanno importare dati da un altro file o sistema di database.

Creo la tabella StringSample

    USE AP
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE StringSample (
        ID CHAR(3) NULL,
        Name VARCHAR(25) NULL,
        AltID CHAR(3) NULL
    ) 
    GO    
                

Inserisco i dati in StringSample

    USE AP
    GO
    INSERT StringSample (ID, Name, AltID) VALUES (N'1  ', N'Lizbeth Darien', N'01 ')
    INSERT StringSample (ID, Name, AltID) VALUES (N'2  ', N'Darnell O''Sullivan', N'02 ')
    INSERT StringSample (ID, Name, AltID) VALUES (N'17 ', N'Lance Pinos-Potter', N'17 ')
    INSERT StringSample (ID, Name, AltID) VALUES (N'20 ', N'Jean Paul Renard', N'20 ')
    INSERT StringSample (ID, Name, AltID) VALUES (N'3  ', N'Alisha von Strump', N'03 ')
                

Come utilizzare la funzione CAST per ordinare in base a una colonna di stringhe che contiene numeri

La tabella StringSample ordinata secondo la colonna ID

    USE AP
    GO
    SELECT * FROM StringSample
    ORDER BY ID
                

La tabella StringSample ordinata in base alla colonna ID di tipo CHAR, trasformata in un numero intero

    USE AP
    GO
    SELECT * FROM StringSample
    ORDER BY CAST(ID AS int)
                

Come utilizzare le funzioni stringa per analizzare una stringa

    USE AP
    GO                    
    SELECT Name,
        LEFT(Name, CHARINDEX(' ', Name) - 1) AS First,
        RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name) ) AS Last
    FROM StringSample
                

Descrizione

Come lavorare con i dati numerici

Oltre alle funzioni di stringa, SQL Server offre diverse funzioni numeriche. Anche se probabilmente si useranno solo un paio di queste funzioni su base regolare, è bene conoscerle tutte, nel caso in cui se ne abbia bisogno. Dopo aver imparato a conoscere queste funzioni, vi mostrerò come utilizzarle e alcune delle altre funzioni che avete imparato a conoscere in questo capitolo per risolvere problemi comuni che si verificano quando si lavora con i dati numerici.

Riassunto delle funzioni numeriche

La Figura che segue riassume otto delle funzioni numeriche che SQL Server mette a disposizione. La funzione che probabilmente verrà utilizzata più spesso è ROUND. Questa funzione arrotonda un numero alla precisione specificata dall'argomento lunghezza. Si noti che è possibile arrotondare le cifre a sinistra del punto decimale codificando un valore negativo per questo argomento. Tuttavia, è più probabile che si codifichi un numero positivo per arrotondare le cifre a destra del punto decimale. È inoltre possibile utilizzare la funzione ROUND per troncare un numero alla lunghezza specificata. A tale scopo, è possibile codificare qualsiasi valore intero diverso da zero per l'argomento opzionale della funzione. La prima serie di esempi in questa figura mostra come funziona la funzione ROUND. Il primo esempio arrotonda il numero 12,5 con una precisione di zero, il che significa che il risultato non ha cifre significative a destra della virgola decimale. Si noti che questa funzione non modifica la precisione del valore. Il risultato ha ancora una cifra a destra della virgola decimale. Il numero è stato solo arrotondato in modo che la cifra sia insignificante. Per chiarire questo punto, il secondo esempio arrotonda un numero con quattro cifre decimali a una precisione pari a zero. Si noti che il risultato ha ancora quattro cifre a destra della virgola, ma sono tutte zero. I tre esempi successivi mostrano variazioni dei primi due esempi. Il terzo arrotonda un numero con quattro cifre decimali a una precisione di 1 e il quarto esempio arrotonda le cifre a destra della virgola decimale a una precisione di 1. Infine, l'ultimo esempio tronca un numero con una precisione di zero. L'altra funzione che probabilmente utilizzerete è ISNUMERIC. Questa funzione restituisce un valore booleano che indica se un'espressione è numerica. Questa funzione è illustrata dalla prossima serie di esempi in questa figura. Questa funzione può essere utile per verificare la validità di un valore prima di salvarlo in una tabella. È possibile utilizzare le tre funzioni successive, ABS, CEILING e FLOOR, per ottenere il valore assoluto di un numero, il più piccolo intero maggiore o uguale a un numero o il più grande intero minore di un numero. Se studiate gli esempi non dovrebbe essere difficile capire come funzionano queste funzioni. Le due funzioni successive, SQUARE e SQRT, servono a calcolare il quadrato e la radice quadrata di un numero. L'ultima funzione, RAND, genera un numero in virgola mobile con un valore casuale compreso tra 0 e 1. SQL Server fornisce una serie di funzioni come queste per l'esecuzione di calcoli matematici ma è improbabile che le utilizziate. Per un elenco completo di queste funzioni, potete cercare "funzioni matematiche" nella documentazione di SQL Server. SQL Server.

Alcune funzioni numeriche

Funzioni numeriche
FunzioneDescrizione
ROUND(number, length [,function])Restituisce il numero arrotondato alla precisione specificata dalla lunghezza. Se lunghezza è positiva, le cifre a destra della virgola decimale vengono arrotondate. Se è negativo, vengono arrotondate le cifre a sinistra della virgola decimale. Per troncare il numero anziché arrotondarlo, codificare un valore non nullo per funzione.
ISNUMERIC(expression)Restituisce il valore 1 (vero) se l'espressione è un valore numerico; altrimenti restituisce il valore 0 (falso).
ABS(number)Restituisce il valore assoluto del numero.
CEILING(number) restituisce il più piccolo valore integer maggiore o uguale al numero specificato.
FLOOR(number)Restituisce il più grande numero intero minore o uguale al numero.
SQUARE(float_number)Restituisce il quadrato di un numero in virgola mobile.
SQRT(float_number)Restituisce la radice quadrata di un numero in virgola mobile.
RAND([integer])Restituisce un numero casuale in virgola mobile compreso tra 0 e 1. Se viene codificato intero, fornisce un valore iniziale per la funzione. Per una connessione, se RAND() viene chiamato con un valore di inizializzazione specificato, tutte le chiamate successive di RAND() producono risultati in base alla chiamata con seeding RAND(). Quindi la query restituisce sempre la stessa sequenza di numeri. Se non viene codificato intero, la funzione restituisce lo stesso numero casuale ogni volta che viene invocata all'interno della stessa query di UPDATE o INSERT.
Esempio dell'utilizzo della funzione numerica ROUND
Precisione 0 cifre decimali

    USE AP
    GO                    
    SELECT ROUND(12.5,0)
                

Esempio dell'utilizzo della funzione numerica ROUND
Precisione 0 cifre decimali

    USE AP
    GO                    
    SELECT ROUND(12.4999,0)
                

Esempio dell'utilizzo della funzione numerica ROUND
Precisione 1 cifra decimale

    USE AP
    GO                    
    SELECT ROUND(12.4999,1)
                

Esempio dell'utilizzo della funzione numerica ROUND
Precisione negativa, arrotondamento delle cifre a sinistra della virgola decimale

    USE AP
    GO                    
    SELECT ROUND(12.4999,-1)
                

Esempio dell'utilizzo della funzione numerica ROUND
Valore non nullo per funzione, numero troncato

    USE AP
    GO                    
    SELECT ROUND(12.4999,0,1)
                

Esempio dell'utilizzo della funzione ISNUMERIC

    USE AP
    GO                    
    SELECT ISNUMERIC(-1.25)
                

Esempio dell'utilizzo della funzione ISNUMERIC

    USE AP
    GO                    
    SELECT ISNUMERIC('SQL Server')
                

Esempio dell'utilizzo della funzione ISNUMERIC

    USE AP
    GO                    
    SELECT ISNUMERIC('2025- 04-10')
                

Esempio dell'utilizzo della funzione ABS

    USE AP
    GO                    
    SELECT ABS(-1.25)
                

Esempio dell'utilizzo della funzione CEILING

    USE AP
    GO                    
    SELECT CEILING(123.45)
                

Esempio dell'utilizzo della funzione CEILING

    USE AP
    GO                    
    SELECT CEILING(-123.45)
                

Esempio dell'utilizzo della funzione FLOOR

    USE AP
    GO                    
    SELECT FLOOR(123.45)
                

Esempio dell'utilizzo della funzione FLOOR

    USE AP
    GO                    
    SELECT FLOOR(-123.45)
                

Esempio dell'utilizzo della funzione SQUARE

    USE AP
    GO                    
    SELECT SQUARE(5.2786)
                

Esempio dell'utilizzo della funzione SQRT

    USE AP
    GO                    
    SELECT SQRT(125.43)
                

Esempio dell'utilizzo della funzione RAND

    USE AP
    GO                    
    SELECT RAND()
                

Esempio dell'utilizzo della funzione RAND
Con un valore di inizializzazione viene restituita sempre la stessa sequenza di numeri.

    USE AP
    GO                    
    SELECT RAND(100), RAND(), RAND()
                

Come risolvere i problemi più comuni che si verificano con i dati numerici

Nella lezione precedente si è appreso che i numeri con i tipi di dati reali non contengono valori esatti. I dettagli sul perché di questa affermazione esulano dallo scopo di questo corso. Da un punto di vista pratico, però, ciò significa che non è opportuno cercare valori esatti quando si lavora con i numeri reali. Se lo si fa, si perdono valori che sono essenzialmente uguali al valore che si sta cercando. Per illustrare, si consideri la tabella RealSample mostrata precedentemente. Questa tabella include una colonna di nome R definita con il tipo di dati float(53). Ora, considera cosa succederebbe se si selezionassero tutte le righe in cui il valore di R è uguale a 1. L'insieme dei risultati includerebbe solo la seconda riga, anche se la tabella contiene altre due righe che hanno valori approssimativamente uguali a 1. Quando si esegue una ricerca su una colonna con un tipo di dato reale, quindi, si vuole di solito cercare un valore approssimativo. Questa figura mostra due modi per per farlo. Innanzitutto, è possibile cercare un intervallo di valori. La prima istruzione SELECT di questa figura, ad esempio, cerca i valori compresi tra .99 e 1.01. In secondo luogo, è possibile cercare valori che si arrotondano a un valore esatto. Questo è illustrato dalla seconda istruzione SELECT. Entrambe le istruzioni restituiscono le tre righe nella tabella RealSample che sono approssimativamente uguali a 1. In effetti, il valore della prima riga è così vicino a 1 che Management Studio rimuove i decimali da questo numero quando visualizza i risultati. Sebbene entrambe le istruzioni SELECT mostrate restituiscano gli stessi risultati, la prima è più efficiente della seconda. Questo perché SQL Server non è in grado di ottimizzare una query che utilizza una funzione nella condizione di ricerca. Per questo motivo, vi consiglio di utilizzare la tecnica dell'intervallo per cercare un valore reale ogni volta che è possibile. Un altro problema che si può incontrare è la formattazione dei valori numerici in modo da renderli facilmente leggibili. Un modo per farlo è formattarli in modo che siano allineati a destra, come mostrato nella terza istruzione SELECT. Per fare ciò, i numeri reali della colonna R vengono prima trasformati in numeri decimali per dare loro una scala coerente. Poi, i valori decimali vengono trasformati in dati di carattere e imbottiti a sinistra con spazi per allineare i dati a destra, come mostrato nella terza istruzione SELECT come mostrato nella colonna denominata R_Formatted. Se si esamina l'espressione per l'ultima colonna, si noterà che è piuttosto complicata. Tuttavia, se la si scompone nelle sue parti, non si dovrebbero avere problemi a capire come funziona. Per aiutarvi a scomporla, la terza, la quarta e la quinta colonna dell'insieme di risultati mostrano i risultati intermedi restituiti da porzioni dell'espressione. Per allineare i valori a destra, nell'ultima colonna si assume una larghezza di colonna di nove caratteri. Poi, la lunghezza del numero da formattare viene sottratta da nove e si utilizza la funzione SPACE per creare una stringa con il numero di spazi risultante. Infine, il numero viene concatenato alla stringa di spazi dopo essere stato convertito in un valore stringa. Il risultato è una colonna di stringhe con i numeri allineati a destra. Tuttavia, questa formattazione non viene visualizzata correttamente quando si usa Management Studio per visualizzare i risultati nella griglia. Di conseguenza, per visualizzare questa formattazione, è necessario fare clic sul pulsante Risultati in testo per visualizzare i risultati come testo.

Creo la tabella RealSample

    USE AP
    GO
    -- create the RealSample table
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE RealSample(
        ID int IDENTITY(1,1) NOT NULL,
        R float(53) NULL -- Precision 15 digits | Storage size 8 bytes
    )                 
                

Inserisco i dati nella tabella RealSample

    USE AP
    GO
    SET IDENTITY_INSERT RealSample ON 
    INSERT RealSample (ID, R) VALUES (1, 1.00000000000001)
    INSERT RealSample (ID, R) VALUES (2, 1)
    INSERT RealSample (ID, R) VALUES (3, 0.999999999999999)
    INSERT RealSample (ID, R) VALUES (4, 1234.56789012345)
    INSERT RealSample (ID, R) VALUES (5, 999.04440209348)
    INSERT RealSample (ID, R) VALUES (6, 24.04849)
    SET IDENTITY_INSERT RealSample OFF
                

Come Management Studio mostra i dati della tabella RealSample

    USE AP
    GO
    SELECT ID, R
    FROM RealSample
                

Cercare valori reali

    USE AP
    GO
    SELECT * FROM RealSample
    WHERE R = 1
                

Come cercare valori reali approssimati

    USE AP
    GO
    SELECT * FROM RealSample
    WHERE R BETWEEN 0.99 AND 1.01
                

Un'istruzione SELECT che cerca i valori arrotondati

    USE AP
    GO        
    SELECT * FROM RealSample
    WHERE ROUND(R,2) = 1
                

Un'istruzione SELECT che formatta i numeri reali

Abilitare risultati in formato testo

    USE AP
    GO                     
    SELECT ID, R, CAST (R AS decimal (9,3 )) AS R_decimal,
        CAST (CAST (R AS decimal (9,3 )) AS varchar ( 9 )) AS R_varchar,
        LEN (CAST (CAST (R AS decimal (9,3 )) AS varchar (9 ))) AS R_LEN,
        SPACE ( 9 - LEN (CAST (CAST (R AS decimal (9,3 )) AS varchar (9 )))) +
            CAST (CAST (R AS decimal (9,3 )) AS varchar (9 )) AS R_Formatted
    FROM RealSample
                

Descrizione

Come lavorare con i dati di data e ora

Negli argomenti che seguono, si apprenderà come utilizzare alcune delle funzioni di SQL Server per lavorare con date e orari. Come si vedrà, queste includono funzioni per estrarre diverse parti di un valore di data/ora e per eseguire operazioni su date e orari. Inoltre, imparerete come eseguire diversi tipi di ricerca su tipi di ricerca sui valori di data/ora.

Un riepilogo delle funzioni di data e ora

La Figura che segue presenta un riepilogo delle funzioni di data/ora e mostra il funzionamento di alcune di esse. Una delle funzioni che utilizzerete spesso è GETDATE, che consente di ottenere la data e l'ora locali correnti dal sistema. GETUTCDATE è simile, ma restituisce la data coordinata del tempo universale (UTC), nota anche come Greenwich Mean Time (GMT). Anche se probabilmente non si utilizzerà spesso la funzione GETUTCDATE, essa è utile se il sistema opera in condizioni di diversi fusi orari. In questo modo, i valori di data/ora rifletteranno sempre l'ora di Greenwich, indipendentemente dal fuso orario in cui vengono inseriti. Ad esempio, un valore di data/ora inserito alle ore 11:00 ora di Los Angeles avrà lo stesso valore di una data/ora inserita alle 14:00 ora di New York. In questo modo è facile confrontare e operare su questi valori. Le tre funzioni successive (SYSDATETIME, SYSUTCDATETIME e SYSDATETIMEOFFSET) funzionano in modo simile alle prime due funzioni. Tuttavia, restituiscono i tipi datetime2 e datetimeoffset, introdotti con SQL Server 2008. Di conseguenza, queste funzioni restituiscono un valore di frazione di secondo più preciso. Inoltre, la funzione SYSDATETIMEOFFSET restituisce un valore che include l'offset del fuso orario. Si noti che l'offset del fuso orario non viene regolato per l'ora legale. Le cinque funzioni successive (DAY, MONTH, YEAR, DATENAME e DATEPART) consentono di estrarre diverse parti di un valore di data. Per ulteriori informazioni su queste funzioni, si può fare riferimento alla figura succwssiva. Per ora è sufficiente sapere che quando si usa DATEPART e DATENAME, è possibile estrarre una qualsiasi delle parti di data. Le funzioni DATEADD e DATEDIFF consentono di eseguire operazioni di addizione e sottrazione su date/ora. Come si può notare, queste funzioni permettono di specificare la parte di data da aggiungere. Per ulteriori informazioni su queste Per ulteriori informazioni su queste funzioni, si veda la figura successiva. Le funzioni TODATETIMEOFFSET e SWITCHOFFSET consentono di lavorare con il datetimeoffset. In particolare, è possibile utilizzare la funzione TODATETIMEOFFSET per aggiungere un fuso orario a un valore datetime2 e restituire un valore datetimeoffset. Inoltre, si può utilizzare la funzione SWITCHOFFSET per specificare un nuovo valore di offset del fuso orario per un valore datetimeoffset. Le due funzioni successive, EOMONTH e DATEFROMPARTS, sono state introdotte con SQL Server 2012. La funzione EOMONTH ottiene l'ultimo giorno del mese per la data specificata. Può essere utile per determinare quali giorni validi per un determinato mese. La funzione DATEFROMPARTS consente di creare un valore di data per un determinato anno, mese e giorno. Oltre a questa funzione, SQL Server 2012 ha introdotto altre funzioni che consentono di creare valori datetime, smalldatetime, time, datetime2 e datetimeoffset. Per ulteriori informazioni, cercare "funzioni di data e ora"”" nella documentazione di SQL Server. L'ultima funzione (ISDATE) restituisce un valore booleano che indica se un'espressione può essere trasformata in un valore valido di data/ora. Questa funzione è utile per verificare la validità di un valore di data/ora prima che venga salvato in una tabella. Questo è illustrato nell'ultima serie di esempi. Qui si può notare che la prima e la terza espressione sono date valide, ma la seconda e la quarta non lo sono. La seconda espressione non è valida perché il mese di settembre ha solo 30 giorni. La quarta espressione non è valida perché un valore temporale può avere un massimo di 59 minuti e 59 secondi. Si noti che questa funzione controlla sia un formato di data/ora valido che un valore di data/ora valido. Le prime due serie di esempi illustrano le differenze tra le funzioni che restituiscono valori di data/ora. Per cominciare, c'è una differenza di 7 ore tra il valore di data/ora restituito dalle funzioni GETDATE e GETUTCDATE. Ciò è dovuto al fatto che se eseguo queste funzioni dalla California, il valore restituito è 7 ore indietro rispetto al Tempo universale coordinato (UTC). Inoltre, si noti che il valore datetime2(7) restituito dalla funzione SYSDATETIME fornisce valori di frazione di secondo più precisi rispetto al valore datetime restituito dalle funzioni GETDATE e GETUTCDATE. Infine, si noti che la funzione SYSDATETIMEOFFSET restituisce un valore di datetimeoffset che include un offset di fuso orario. Il terzo gruppo di esempi mostra come utilizzare le parti di data con le funzioni DATEPART e DATENAME. Per cominciare, non è necessario specificare una parte di data quando si usa la funzione MONTH per restituire un valore intero per il mese. Tuttavia, è possibile ottenere lo stesso risultato con la funzione DATEPART specificando la parte della data del mese come primo argomento. Oppure, se si desidera restituire il nome del mese come stringa di caratteri, si può specificare la parte della data del mese come primo argomento della funzione DATENAME. Infine, è possibile utilizzare un'abbreviazione per una parte della data, quando ha senso. Tuttavia, in genere preferisco evitare le abbreviazioni, perché tendono a rendere il codice più difficile da leggere e da comprendere. Il quarto gruppo di esempi mostra come utilizzare le funzioni EOMONTH e DATEFROMPARTS, introdotte con SQL Server 2012. In questo caso, la prima espressione utilizza la funzione EOMONTH per restituire una data per l'ultimo giorno del mese del 1° febbraio 2016. Poiché il 2016 è un anno bisestile, viene restituita la data del 29 febbraio 2016. La seconda espressione è simile, ma aggiunge due mesi alla data specificata. Infine, l'ultima espressione utilizza la funzione DATEFROMPARTS per creare una data con un valore di anno 2024, un valore di mese 4 e un valore di giorno 10.

Valori e abbreviazioni delle parti di data

Parti di data
ArgomentoAbbreviazioni
yearyy,yyyy
quarterqq,q
monthmm, m
dayofyeardy,y
daydd,d
weekwk, ww
weekdaydw
hourhh
minutemi,n
secondss,s
millisecondms
microsecondmcs
nanosecondns
tzoffsettz

Funzioni di data/ora

    USE AP
    GO
    SELECT GETDATE()
                

Funzioni di data/ora

    USE AP
    GO
    SELECT GETUTCDATE()
                

Funzioni di data/ora

    USE AP
    GO
    SELECT SYSDATETIME()
                

Funzioni di data/ora

    USE AP
    GO
    SELECT SYSUTCDATETIME()
                

Funzioni di data/ora

    USE AP
    GO
    SELECT SYSDATETIMEOFFSET()
                

Funzioni di data/ora

    USE AP
    GO
    SELECT MONTH('2025-04-10')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT DATEPART(month, '2025-04-10')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT DATENAME(month, '2025-04-10')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT DATENAME(m, '2025-04-10')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT EOMONTH('2016-02-01')
                

Funzioni di data/ora

Aggiunge due mesi alla data specificata

    USE AP
    GO
    SELECT EOMONTH('2016-02-01', 2)
                

Funzioni di data/ora

    USE AP
    GO
    SELECT DATEFROMPARTS(2025,4,10)
                

Funzioni di data/ora

    USE AP
    GO
    SELECT ISDATE('2025-04-10')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT ISDATE('2025-04-31')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT ISDATE('23:59:59')
                

Funzioni di data/ora

    USE AP
    GO
    SELECT ISDATE('23:60:60')
                

Come analizzare date e orari

La Figura che segue mostra come utilizzare le funzioni DAY, MONTH, YEAR, DATEPART e DATENAME per analizzare date e orari. Se è sufficiente ottenere un valore intero per un giorno, un mese o un anno, si devono usare le funzioni DAY, MONTH, YEAR. Sono funzioni standard ANSI. Se si desidera estrarre un'altra parte di una data o di un'ora come numero intero, è necessario utilizzare la funzione DATEPART. E per estrarre una parte di data come stringa, è necessario utilizzare la funzione DATENAME. Questa figura mostra il risultato dell'utilizzo di ciascuno dei valori della parte di data con le funzioni DATEPART e DATENAME. Come si può notare, molti dei valori restituiti dalle due funzioni sembrano essere gli stessi. Si tenga presente, tuttavia, che tutti i valori restituiti da DATEPART sono numeri interi. Al contrario, tutti i valori restituiti da DATENAME sono stringhe. Ecco perché il mese e la settimana sono restituiti come nomi anziché come numeri quando si usa DATENAME. La funzione dipende da cosa si deve fare con la parte della data. Se si deve utilizzare la parte di data in un'operazione aritmetica, ad esempio, si deve usare la funzione DATEPART. Se invece è necessario utilizzarla in una concatenazione, è necessario utilizzare la funzione DATENAME. Infine, è importante notare la differenza tra le funzioni DATEPART e DATENAME quando si lavora con la parte di data tzoffset. Con questa parte, la funzione DATEPART restituisce un valore intero per il numero di minuti per l'offset del fuso orario e la funzione DATENAME restituisce un valore stringa che specifica le ore e i minuti.

Esempi che utilizzano le funzioni DAY, MONTH, YEAR

    USE AP
    GO
    SELECT DAY('2025-04-10')
                

Esempi che utilizzano le funzioni DAY, MONTH, YEAR

    USE AP
    GO
    SELECT MONTH('2025-04-10')
                

Esempi che utilizzano le funzioni DAY, MONTH, YEAR

    USE AP
    GO
    SELECT YEAR('2025-04-10')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(day, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(month, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(year, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(hour, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(minute, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(second, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(quarter, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(dayofyear, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(week, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(weekday, '2025-04-10 11:35:00') -- giorno della settimana
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(millisecond, '11:35:00.1234567')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(microsecond, '11:35:00.1234567')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(nanosecond, '11:35:00.1234567')
                

Esempi che utilizzano la funzione DATEPART

    USE AP
    GO
    SELECT DATEPART(tzoffset, '11:35:00.1234567 -07: 00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(day, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(month, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(year, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(hour, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(minute, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(second, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(quarter, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(dayofyear, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(week, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(weekday, '2025-04-10 11:35:00')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(millisecond, '2025-04-10 11:35:00.1234567')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(microsecond, '2025-04-10 11:35:00.1234567')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(nanosecond, '2025-04-10 11:35:00.1234567')
                

Esempi che utilizzano la funzione DATENAME

    USE AP
    GO
    SELECT DATENAME(tzoffset, '2025-04-10 11:35:00.1234567')
                

Note

Come eseguire operazioni su date e orari

La Figura che segue mostra come utilizzare le funzioni DATEADD e DATEDIFF per eseguire operazioni su date e orari. È possibile utilizzare la funzione DATEADD per aggiungere un numero specifico di parti di data a una data. Le prime otto funzioni DATEADD di questa figura, ad esempio, mostrano come aggiungere un giorno, un mese, un anno, un'ora, un minuto, un secondo e un'ora, trimestre e settimana a un valore di data/ora. Se si desidera sottrarre parti di data da un valore di datetime, è possibile farlo con la funzione DATEADD. Basta codificare l'argomento numero come valore negativo, come illustrato dalla penultima funzione DATEADD. L'ultima funzione DATEADD dimostra che non è possibile aggiungere un numero frazionario di parti di data a un valore di data/ora. Se si tenta di farlo, la parte frazionaria viene ignorata. Se è necessario trovare la differenza tra due valori di datetime, si può usare la funzione DATEDIFF, come illustrato nella seconda serie di esempi di questa figura. Come si può notare, il risultato è espresso nelle unità della parte di data specificate dall'utente. La prima funzione, ad esempio, restituisce il numero di giorni tra due date, e il secondo esempio restituisce il numero di mesi tra le stesse due date. Nella maggior parte dei casi, la data precedente viene specificata come secondo argomento della funzione DATEDIFF e la data successiva viene specificata come terzo argomento. In questo modo, il risultato della funzione è un valore positivo. Tuttavia, è anche possibile codificare la data successiva per prima. In questo caso, il risultato è un valore negativo, come si può vedere nell'ultima funzione DATEDIFF in questa figura. Se si utilizza la funzione DATEDIFF, si deve tenere presente che essa restituisce il numero di confini di datetime attraversati, che non è necessariamente lo stesso del numero di intervalli tra due date. Per capirlo, si consideri il terzo esempio della terza funzione DATEDIFF. Questa funzione restituisce la differenza in anni tra le date. Poiché la seconda data è successiva di meno di un anno rispetto alla prima data, ci si potrebbe aspettare che questa funzione restituisca un valore pari a zero. Come si può vedere, tuttavia, restituisce un valore pari a 1 perché ha attraversato il confine di un anno tra il 2015 e il 2016. Poiché questo non è intuitivo, è bene usare questa funzione con attenzione. Gli ultimi tre esempi di questa figura mostrano come sia possibile eseguire operazioni su date e orari senza utilizzare le funzioni DATEADD e DATEDIFF. La prima espressione, ad esempio, aggiunge un giorno a un valore di datetime, mentre la seconda espressione sottrae un giorno a un valore di datetime. Quando si utilizza questa tecnica, SQL Server presume che si stiano aggiungendo o sottraendo giorni. Non è quindi possibile aggiungere o sottrarre altre parti di data, a meno che non le si esprima come multipli o frazioni di giorni. L'ultima espressione mostra come sottrarre due valori di datetime per calcolare il numero di giorni che li separano. Notate che dopo che le date sono state sottratte, il risultato viene convertito in un numero intero. Questo è necessario perché il risultato dell'operazione di sottrazione viene implicitamente lanciato come un valore di datetime che rappresenta il numero di giorni successivi al 1° gennaio 1900. Per questo motivo, il valore intero di 304 giorni viene interpretato come il seguente valore di datetime: 1900-10-31 00:00:00:000.

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(day, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(month, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(year, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(hour, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(minute, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(second, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(quarter, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(week, 1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(month, -1, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEADD

    USE AP
    GO
    SELECT DATEADD(year, 1.5, CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(day, CONVERT(datetime, '2025-04-30T11:35:00'), CONVERT(datetime, '2026-02-14T09:30:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(month, CONVERT(datetime, '2025-04-30T11:35:00'), CONVERT(datetime, '2026-02-14T09:30:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(year, CONVERT(datetime, '2025-04-30T11:35:00'), CONVERT(datetime, '2026-02-14T09:30:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(hour, CONVERT(datetime, '06:46:45'), CONVERT(datetime, '11:35:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(minute, CONVERT(datetime, '06:46:45'), CONVERT(datetime, '11:35:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(second, CONVERT(datetime, '06:46:45'), CONVERT(datetime, '11:35:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(quarter, CONVERT(datetime, '2025-04-30T11:35:00'), CONVERT(datetime, '2026-02-14T09:30:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(week, CONVERT(datetime, '2025-04-30T11:35:00'), CONVERT(datetime, '2026-02-14T09:30:20'))
                

Esempi che utilizzano la funzione DATEDIFF

    USE AP
    GO
    SELECT DATEDIFF(day, CONVERT(datetime, '2026-02-14T09:30:20'), CONVERT(datetime, '2025-04-30T11:35:00'))
                

Esempi che utilizzano gli operatori di addizione e sottrazione

    USE AP
    GO
    SELECT CONVERT(smalldatetime, '2025-04-14T09:30:20') + 1
                

Esempi che utilizzano gli operatori di addizione e sottrazione

    USE AP
    GO
    SELECT CONVERT(smalldatetime, '2025-04-14T09:30:20') - 1
                

Esempi che utilizzano gli operatori di addizione e sottrazione

    USE AP
    GO
    SELECT CONVERT(int, CONVERT(smalldatetime, '2025-08-16T10:15:20') - CONVERT(smalldatetime, '2025-04-14T09:30:20')) 
                

Descrizione

Come eseguire una ricerca per data

Poiché i valori di datetime spesso contengono sia una componente di data che di ora, la ricerca di date e orari specifici può essere difficile. In questo argomento si apprenderà un modo per ignorare la componente temporale quando si cerca un valore di data. Nel prossimo argomento, invece, imparerete come ignorare i componenti della data nella ricerca di valori temporali. Prima di continuare, è bene sapere che i problemi descritti qui possono essere evitati progettando il database in modo diverso. Ad esempio, se non è necessario includere un componente temporale, si può usare il tipo di dati date per la colonna che memorizza la data. In questo modo, non c'è alcun componente temporale a complicare le ricerche sulla data. Al contrario, se non è necessario includere una componente data, si può usare il tipo di dati time per la colonna che contiene l'ora. Naturalmente, questi tipi di dati sono stati introdotti con SQL Server 2008. La Figura che segue illustra il problema che si può incontrare durante la ricerca di date. Gli esempi in questa figura utilizzano una tabella denominata DateSample. Questa tabella include una colonna ID che contiene un valore intero e una colonna StartDate che contiene un valore datetime. Si noti che i componenti temporali delle prime tre righe di questa tabella hanno un valore pari a zero. Al contrario, i componenti temporali nelle tre righe successive hanno componenti temporali non nulli. Il problema si verifica quando si cerca un valore di data. La prima istruzione SELECT di questa figura, ad esempio, cerca le righe nella tabella DateSample con la data 2011-10-28. Poiché non è stato specificato un componente temporale, viene aggiunto un componente temporale nullo quando la stringa di data viene convertita in un valore datetime. Tuttavia, poiché la riga con questa data ha un valore temporale non nullo, nessuna riga viene restituita dalla tabella DateSample. Per risolvere questo problema, è possibile utilizzare una delle cinque tecniche mostrate in questa figura. Di queste tecniche, la prima è di solito la più facile da usare. In questo caso, si utilizza la funzione CONVERT per convertire il valore di datetime in un valore di data. Naturalmente, questo funziona solo con SQL Server 2008 o successivo. Di conseguenza, se dovete lavorare con una versione precedente di SQL Server, dovrete usare una delle altre tecniche. Ad esempio, è possibile utilizzare la seconda tecnica per cercare date maggiori o uguali alla data che si sta cercando e minori della data successiva a quella cercata. Oppure, si può usare la terza tecnica per cercare i valori restituiti dalle funzioni month, day e year. La quarta tecnica consiste nell'utilizzare la funzione CAST per convertire il valore della colonna StartDate in una stringa di 11 caratteri. Questo fa sì che la parte temporale della data venga troncata (se si guarda alla figura, si vedrà che quando un tipo di dati datetime viene trasformato in un tipo di dati stringa, la porzione di data contiene 11 caratteri nel formato "Mon dd yyyy"). Quindi, la stringa viene riconvertita in un valore datetime, che aggiunge una componente temporale pari a zero. L'ultima tecnica è simile, ma utilizza la funzione CONVERT invece della funzione CAST. Il codice di stile utilizzato in questa funzione converte il valore di datetime in una stringa di 10 caratteri che non include l'ora. Quindi, la stringa viene convertita in una data con una componente temporale pari a zero.

Creo la tabella DateSample

    USE AP
    GO                    
    -- create the DateSample table
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE DateSample (
        ID int IDENTITY(1,1) NOT NULL,
        StartDate datetime NULL
    )
                

Inserisco i dati nella tabella DateSample

    USE AP
    GO
    SET IDENTITY_INSERT DateSample ON 
    INSERT DateSample (ID, StartDate) VALUES (1, CAST(N'1993-11-01T00:00:00.000' AS DateTime))
    INSERT DateSample (ID, StartDate) VALUES (2, CAST(N'2013-10-28T00:00:00.000' AS DateTime))
    INSERT DateSample (ID, StartDate) VALUES (3, CAST(N'2018-06-30T00:00:00.000' AS DateTime))
    INSERT DateSample (ID, StartDate) VALUES (4, CAST(N'2019-10-28T10:00:00.000' AS DateTime))
    INSERT DateSample (ID, StartDate) VALUES (5, CAST(N'2022-10-28T13:58:32.823' AS DateTime))
    INSERT DateSample (ID, StartDate) VALUES (6, CAST(N'2022-11-01T09:02:25.000' AS DateTime))
    SET IDENTITY_INSERT DateSample OFF
                

Il contenuto della tabella DateSample

    USE AP
    GO
    SELECT ID, StartDate
    FROM DateSample
                

Una condizione di ricerca che non restituisce una riga

    USE AP
    GO
    SELECT * FROM DateSample
    WHERE StartDate = '2022-10-28'    
                

Cinque istruzioni SELECT che ignorano i valori temporali

Un'istruzione SELECT che utilizza il tipo date per rimuovere i valori temporali (SQL Server 2008 o successivo)

    USE AP
    GO
    SELECT * FROM DateSample
    WHERE CONVERT(date, StartDate) = '2022-10-28'
                

Un'istruzione SELECT che ricerca un intervallo di date

    USE AP
    GO                    
    SELECT * FROM DateSample
    WHERE StartDate >= CONVERT(date,'2022-10-28') AND StartDate < CONVERT(date,'2022-10-29')
                

>

Esercizi

Se non diversamente indicato, utilizzare la sintassi di unione esplicita

    USE AP
    GO
    SELECT VendorContactFName + ' ' +
        LEFT(VendorContactLName, 1) + '.' AS Contact,
        SUBSTRING(VendorPhone,7,8) AS Phone
    --Also acceptable:
    --     REPLACE(VendorPhone,'(559) ','') AS Phone
    FROM Vendors
    WHERE LEFT(VendorPhone,4) = '(559'
    ORDER BY Contact
                          

    USE AP
    GO
    SELECT InvoiceNumber,
        (InvoiceTotal - CreditTotal - PaymentTotal) AS Balance
    FROM Invoices
    WHERE (InvoiceTotal - CreditTotal - PaymentTotal) > 0 AND
        InvoiceDueDate < GETDATE() + 30
                          

    USE AP
    GO
    SELECT InvoiceNumber,
        (InvoiceTotal - CreditTotal - PaymentTotal) AS Balance
    FROM Invoices
    WHERE (InvoiceTotal - CreditTotal - PaymentTotal) > 0 AND
        InvoiceDueDate <
        CAST(CAST(YEAR(GETDATE()) AS char(4)) + '-' +
            CAST(MONTH(GETDATE()) + 1 AS char(2)) + '-01' AS datetime) - 1
                          
Per visualizzare le soluzioni degli esercizi devi inserire la password fornita dal docente