i denne videoen vil vi gå deg om hvordan du bruker SQL BETWEEN operator; vi vil vise deg hvorfor du ønsker å bruke BETWEEN operator og hvordan du kan unngå fallgruver når du bruker DEN MED DATETIME type.
MELLOMOPERATOREN er ekvivalent med bruk og kombinasjon av >= og <= sammenligningsoperatorer, men gir en mer kompakt rekkevidde sammenligning. Når du har gått gjennom denne artikkelen, vil jeg anbefale å se på vårt neste Viktige SQL-Minutt for å fortsette å lære mer om SQL Server!
når du har sett videoen, sjekk ut eksempelkoden nedenfor. Jeg har også tatt med et transkripsjon for deg å bruke.
Dette ER EN SQL Minutt PÅ Mellom Operatør!
Velkommen til Et Annet Viktig SQL-Minutt. I denne episoden skal vi lære å bruke BETWEEN-operatoren til å sammenligne en rekke verdier I SQL server-spørringer.
OPERATOREN MELLOM brukes til å sammenligne en rekke verdier. Her er et eksempel der jeg bruker det til å sammenligne en rekke verdier som er større enn eller lik 12, og mindre enn eller lik 28. Nar JEG bruker BETWEEN operator, er det inkluderende.
det vil inkludere tallene som vi sammenligner i mellom av. Den vanlige formen FOR Å bruke MELLOM I WHERE-klausulen er å spesifisere feltet, så i dette tilfellet er det «IsoNumericCode», det er feltet. Så MELLOM operatørene; vi sier at vi vil at «IsoNumericCode» skal VÆRE MELLOM og deretter området. Så vi vil at det skal være mellom 12 og 28.
du lurer kanskje på hvordan dette vil se ut som den gammeldagse måten å bruke større enn og lik og mindre enn og lik. Dette er hvordan det ville se ut. Hvis Vi skulle gjøre det samme ved å bruke større enn og lik og mindre enn og lik, ville Vi ha Hvor IsoNumericCode >=12 Og IsoNumericCode <= 28.
Ok, så la Oss gå inn for å se hvordan dette ser ut i SQL server. Jeg har vår spørring lastet opp I SQL server. Du kan se her at Vi skal se Etter IsoNumericCode MELLOM 12 og 28, det er på samme linje, det er vanligvis hvordan det ville bli skrevet.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
La meg kjøre det, og ta dette opp litt her. Du kan se at rekkevidden av verdier som kommer tilbake er fra 12 til 28. Hvis jeg skulle oke dette la oss si til 100, ville jeg forvente a se flere rader komme tilbake. Du kan se at de går helt opp til 100.
Nå vil Jeg advare deg om at ordren gjør noe. Hvis JEG gjorde mellom 100 og 12, får jeg ingen resultater.Fordi, hvis du tenker på det, hva dette sier er at jeg vil at de numeriske kodene skal være mellom … jeg vil at den skal være større enn eller lik 100, og mindre enn eller lik 12. Det er ingenting mellom det. Så det er en feil ingenting kommer tilbake. Så bestill saker, og det er viktig at du har det slik at du bruker MELLOMOPERATØREN, det laveste nummeret er først. Ok, la oss gå tilbake til 12 og 28.
En Annen ting jeg kan gjøre er å bruke ikke operatør MED MELLOM. Så hvis jeg sier «IKKE MELLOM 12 og 28», er det jeg egentlig sier, la oss ta tilbake hver rad i landtabellen som ikke har en numerisk kode som er større enn eller lik 12, og mindre enn eller lik 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
så egentlig vil disse fire radene bli skåret ut av det resultatet. La oss kjøre dette. Du kan se nå jeg får 186 rader.
Hvis jeg bare gjorde spørringen uten noen begrensninger på det, ser du at jeg får 190 rader tilbake. Så dette tjener til å vise deg at de fire radene faktisk ble skåret ut. Faktisk, hvis du vil gjøre en annen test, kan jeg bare si Eller IsoNumericCode MELLOM 12 OG 28, og dette vil bringe tilbake alt.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
så dette bringer tilbake 190 rader. Egentlig, dette er litt nonsensisk i den forstand at det bringer tilbake alle rader.
Alle våre eksempler så langt har jobbet med heltallet. MEN mellom arbeider med mange andre datatyper. Vi kan også bruke den til tegndatatyper( VARCHAR), og det ville fungere på samme måte, så lenge vi har sorteringsordrene satt, fungerer alt bra.
En datatype selv om jeg tror du må være forsiktig med, er datatypen «DateTime».
Fordi I Datatypen DateTime ser du at det er en tidskomponent i datoen, og hvis vi bare GJØR en MELLOM å bruke bare dagen og ikke tiden, vil datoen og klokkeslettet standard til midnatt. Det er egentlig ikke å få alle resultatene du tror det ville. Jeg tror den beste måten å gjøre dette på er å vise deg hva jeg mener.
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');
jeg skal ta med et eksempel hvor vi skal erklære et bord, og i dette bordet skal vi trekke inn datoer fra 1. februar til 3. februar. Når jeg kjører dette, skal du se at jeg får fem rader tilbake.
Legg merke til hvordan det er tider på disse, ikke sant? Hvis jeg ikke angir en tid på en dato, kommer den tilbake med en dato som starter ved midnatt. Så langt, så bra.Det store spørsmålet ville være så hva skal skje da på en annen spørring her, hvis jeg tar tilbake «ModifyDate» MELLOM 1. og 3.?
hvis jeg sier det på engelsk, forventer jeg at alle fem av disse kommer tilbake. Men jeg kommer til å si akkurat nå at ikke alle fem kommer til å komme tilbake, fordi dette her som har 3rd på det, når det blir konvertert Til DateTime vil faktisk ha en tid på midnatt. Så det kommer til å slippe den 5. rad. La meg vise deg hva jeg mener her.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
som du kan se, nå er det i utgangspunktet å bringe tilbake bare fire rader fordi vi leter etter i hovedsak datoer og klokkeslett som er mellom midnatt 1. og omtrent midnatt 3.
En måte du kan omgå dette på er å sette inn tiden rett før midnatt. Så bare for å … jeg skal gå ut til sekunder her. Så nå når jeg kjører dette, ser du at jeg får fem rader fordi det kommer til» 11:59:59 » sekunder.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
jeg teller ikke hundrevis av sekunder og så videre. For å være ærlig, føler jeg at det er litt rotete. Jeg føler hvis du virkelig ønsker Å bruke MELLOM med datoer i dette tilfellet, og du ønsket å få hver dato mulig med sin tid fra 3., den beste måten å gjøre det på er bare å bruke 4.
VELG Navn, ModifyDate
FRA @myTable
Hvor ModifyDate MELLOM ‘2017-02-01’ OG ‘2017-02-04’
BESTILL Ved ModifyDate
I dette tilfellet, MELLOM Med DateTime er ikke nødvendigvis bruker samme atferd som vi tror det ville med heltall, fordi selv om det er inkluderende, dette kommer til å gå til midnatt, som er akkurat det nanosekund forbi 3rd. Det ser bare morsomt ut. Når jeg kjører dette, ser du at det trekker inn den datoen fra siste del av 3rd.
Så det er en gotcha med MELLOM Og DateTime. Så jeg vet at mange mennesker slags unngå MELLOM med datoer og tid, og de vil bare bruke større enn og mindre enn.
Så det ber om spørsmålet; hvorfor vil DU bruke MELLOM?
jeg tror det er to grunner til at du vil bruke MELLOM. Den første er lesbarhet. Den andre er vedlikehold.for lesbarhet mener jeg at hvis jeg måtte si at vi Er «ModifyDate» er større enn og lik 1., og «ModifyDate» er mindre enn lik 4., i en veldig lang spørring kan dette bli vanskelig å lese fordi det er mange uttrykk å begynne å analysere gjennom, og Den Boolske logikken kan komme i veien. I DEN forstand, MELLOM kan virke litt mer naturlig å lese. Med fare for misforståelse hva det faktisk gjør, som vi har forklart Med DateTime.Også, fra et maintainability synspunkt, hvis jeg vil gå inn og jeg må endre som «ModifyDate» til, vet jeg at jeg kan komme inn her, og jeg må endre den på to steder. Jeg må endre den første delen av begrepet og den andre delen, hypotetisk. Hvor hvis jeg bare bruker MELLOM, trenger jeg bare å endre den på ett sted.Hvis du vil vite om du vil bruke MELLOM eller større enn eller mindre enn, bruker jeg personlig større enn eller mindre enn, for da vet jeg hvilken handling som faktisk blir tatt. Jeg føler at jeg har litt mer eksplisitt å si i hva som skjer, og det får meg til å føle meg bedre. Jeg trenger ikke å bekymre meg, «Er det virkelig fungerer? Er det å ta datoen før midnatt?»Alle slike antagelser går ut av vinduet. Jeg liker å jobbe der det ikke er forutsetninger i datamaskiner, det får meg bare til å føle meg mer glad. Jeg personlig bruker IKKE MELLOM. Men hvis du liker det, synes jeg det er flott å bruke. Den støttes i mange FORSKJELLIGE SQL dialekter, og jeg sier gå for det. Takk igjen, ha en god dag.