In questo video ti mostreremo come utilizzare l’SQL TRA operatore; ti mostreremo perché vorresti usare l’operatore BETWEEN e come evitare insidie quando lo usi con il tipo DATETIME.
L’operatore BETWEEN è equivalente all’utilizzo e alla combinazione di >= e <= operatori di confronto, ma consente un confronto dell’intervallo più compatto. Una volta che hai esaminato questo articolo, ti consiglio di guardare il nostro prossimo Essential SQL Minute per continuare a saperne di più su SQL Server!
Dopo aver guardato il video controlla il codice di esempio qui sotto. Ho anche incluso una trascrizione da usare.
Questo è un minuto SQL sull’operatore BETWEEN!
Benvenuti in un altro minuto SQL essenziale. In questo episodio, impareremo come utilizzare l’operatore BETWEEN per confrontare un intervallo di valori nelle query di SQL Server.
L’operatore BETWEEN viene utilizzato per confrontare un intervallo di valori. Ecco un esempio in cui lo sto usando per confrontare un intervallo di valori maggiori o uguali a 12 e inferiori o uguali a 28. Quando uso l’operatore BETWEEN, è inclusivo.
Includerà i numeri che stiamo confrontando tra di. Il modulo comune per l’utilizzo di BETWEEN nella clausola WHERE è specificare il campo, quindi in questo caso è “IsoNumericCode”, questo è il campo. Quindi TRA gli operatori; stiamo dicendo che vogliamo che “IsoNumericCode” sia TRA e quindi l’intervallo. Quindi vogliamo che sia tra 12 e 28.
Si potrebbe chiedere che cosa questo sarebbe simile alla vecchia maniera, utilizzando maggiore e uguale e inferiore e pari a. Ecco come sarebbe. Se dovessimo fare la stessa cosa usando maggiore di e uguale a e minore di e uguale a, avremmo dove IsoNumericCode >=12 E IsoNumericCode <= 28.
Va bene, quindi andiamo a vedere come appare in SQL server. Ho caricato la nostra query in SQL Server. Puoi vedere qui che cercheremo l’IsoNumericCode TRA 12 e 28, è sulla stessa linea, in genere è come sarebbe scritto.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
Fammi eseguire questo, e portare questo un po ‘ qui. Puoi vedere che l’intervallo di valori che tornano sono da 12 a 28. Se dovessi aumentare questo diciamo a 100, mi aspetterei di vedere più righe tornare. Puoi vedere che vanno fino a 100.
Ora, voglio avvertirti che l’ordine ha importanza. Se ho fatto TRA 100 e 12, non otterrò risultati.
Perché, se ci pensi, quello che sta dicendo è che voglio che i codici numerici siano compresi tra want Voglio che sia maggiore o uguale a 100 e minore o uguale a 12. Non c’e ‘ niente tra questo. Quindi è un difetto che non ritorna nulla. Quindi l’ordine è importante, ed è importante averlo in modo che usando l’operatore BETWEEN, il numero più basso sia il primo. Bene, torniamo al 12 e al 28.
Un’altra cosa che posso fare è usare NON operatore con BETWEEN. Quindi se dico “NON TRA 12 e 28” quello che sto davvero dicendo è riportiamo ogni riga nella tabella dei paesi che non ha un codice numerico maggiore o uguale a 12 e minore o uguale a 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
Quindi, in sostanza, queste quattro righe sarebbero state ricavate da quel risultato. Facciamolo. Ora puoi vedere che sto ottenendo 186 righe.
Se ho appena fatto la query a titolo definitivo senza alcuna restrizione su di esso, vedrai che ottengo 190 righe indietro. Quindi questo serve a mostrarvi che quelle quattro file venivano effettivamente scavate. In effetti, se vuoi fare un altro test, potrei semplicemente dire O IsoNumericCode TRA 12 e 28 e questo riporterebbe tutto.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
Quindi questo riporta 190 righe. In realtà, questo è un po ‘ assurdo nel senso che sta riportando tutte le righe.
Tutti i nostri esempi finora hanno funzionato con il numero intero. Ma TRA funziona con molti altri tipi di dati. Potremmo anche usarlo per i tipi di dati di carattere (VARCHAR), e funzionerebbe allo stesso modo finché abbiamo impostato gli ordini di confronto, tutto funziona bene.
Un tipo di dati, anche se penso che sia necessario fare attenzione, è il tipo di dati “DateTime”.
Perché nel tipo di dati DateTime, vedrai che c’è un componente temporale nella data, e se facciamo solo un TRA l’uso solo del giorno e non dell’ora, la data e l’ora saranno predefinite a mezzanotte. Non sta davvero ottenendo tutti i risultati che pensi che sarebbe. Penso che il modo migliore per farlo sia mostrarti cosa intendo.
DECLARE @myTable TABLE(Name varchar(40), ModifyDate DateTime)INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 08:23:42');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 14:04:02');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03 22:32:43');
Introdurrò un esempio in cui dichiareremo una tabella, e in questa tabella inseriremo le date dal 1 febbraio al 3. Quando eseguirò questo, vedrai che riavrò cinque file indietro.
Notare come ci sono tempi su questi, giusto? Se non specificoun orario in una data, ritorna con una data a partire da mezzanotte. Finora, tutto bene.
La grande domanda sarebbe quindi cosa succederà allora su un’altra query qui, se riporto “ModifyDate” TRA il 1 ° e il 3°?
Se lo dico in inglese, mi aspetterei che tutti e cinque tornino. Ma sto per dire in questo momento che non tutti e cinque torneranno, perché questo qui che ha il 3rd su di esso, quando verrà convertito in DateTime avrà effettivamente un tempo di mezzanotte. Quindi sta per cadere quella 5a fila. Lascia che ti mostri cosa intendo qui.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
Come puoi vedere, ora sta fondamentalmente riportando solo quattro righe perché stiamo cercando in sostanza date e orari che sono tra la mezzanotte del 1 ° e circa la mezzanotte del 3°.
Un modo per aggirare questo problema è inserire l’ora appena prima di mezzanotte. Quindi, solo per … vado ai secondi qui. Quindi ora quando eseguo questo vedrete che ottengo cinque righe perché sta andando a “11: 59: 59” secondi.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
Non sto contando le centinaia di secondi e così via. Ad essere onesti, sento che è un po ‘ disordinato. Sento che se vuoi davvero usare BETWEEN with dates in questo caso, e volevi ottenere ogni data possibile con il suo tempo dal 3°, il modo migliore per farlo è solo usare il 4°.
SELEZIONA Nome, ModifyDate
DA @myTable
DOVE ModifyDate TRA ‘2017-02-01’ E ‘2017-02-04’
ORDER BY ModifyDate
In questo caso, BETWEEN with DateTime non sta necessariamente usando lo stesso comportamento che penseremmo con gli interi, perché sebbene sia inclusivo, questo andrà a mezzanotte, che è solo quel nanosecondo oltre il 3°. Sembra divertente. Quando eseguo questo, vedrai che tira in quella data dall’ultima parte del 3°.
Quindi questo è un gotcha con BETWEEN e DateTime. Quindi so che un sacco di gente tipo di evitare tra con le date e il tempo, e faranno solo usare maggiore e minore di.
Quindi pone la domanda; perché dovresti usare BETWEEN?
Penso che ci siano due motivi per cui vorresti usare BETWEEN. Il primo è la leggibilità. Il secondo è la manutenibilità.
Per leggibilità, quello che voglio dire è che se dovessi dire che siamo “ModifyDate” è maggiore e uguale al 1°, e “ModifyDate” è minore che uguale al 4°, in una query molto lunga questo potrebbe diventare difficile da leggere perché sono molte espressioni da iniziare ad analizzare, e la logica booleana potrebbe intralciarmi. In questo senso, BETWEEN potrebbe sembrare un po ‘ più naturale da leggere. A rischio di fraintendere ciò che sta effettivamente facendo, come abbiamo spiegato con DateTime.
Inoltre, da un punto di vista della manutenibilità, se voglio entrare e ho bisogno di cambiare come “ModifyDate”, so che posso entrare qui e devo cambiarlo in due punti. Dovrei cambiare la prima parte del termine e la seconda parte, ipoteticamente. Dove se sto solo usando BETWEEN, ho bisogno solo di cambiarlo in un posto.
Se vuoi sapere la mia opinione se useresti BETWEEN o greater than o less than, io personalmente uso greater than o less than, perché allora so quale azione viene effettivamente intrapresa. Sento di avere una voce un po ‘ più esplicita in quello che sta succedendo, e questo mi fa sentire meglio. Non devo preoccuparmi, ” Funziona davvero? Sta prendendo l’appuntamento prima di mezzanotte?”Tutto quel tipo di roba di assunzione va fuori dalla finestra. Mi piace lavorare dove non ci sono ipotesi nei computer, mi fa sentire più felice. Io personalmente non uso TRA. Ma se ti piace, penso che sia fantastico da usare. È supportato in molti dialetti SQL diversi, e dico di farlo. Grazie ancora, buona giornata.