Query vergelijken datums in SQL

Ik heb een tabel met datums die allemaal in de maand november zijn gebeurd.
Ik heb deze vraag geschreven

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'

Deze zoekopdracht zou alles moeten retourneren wat er in maand 11 (november) is gebeurd, omdat het vóór de datum ‘2013-04-12’ (in december)

is gebeurd.

Maar het geeft alleen beschikbare datums terug die plaatsvonden in dagen minder dan 04 (2013-04-12)

Kan het zijn dat het alleen het daggedeelte vergelijkt? en niet de hele datum?

Hoe dit op te lossen?

Created_date is van het type date

Datumnotatie is standaard jjjj-dd-MM


Antwoord 1, autoriteit 100%

Gebruik in plaats van ‘2013-04-12’ waarvan de betekenis afhangt van de lokale cultuur, ‘20130412’, dat wordt erkend als het cultuurinvariante formaat.

Als je wilt vergelijken met 4de, moet je ‘20131204’ schrijven. Als u wilt vergelijken met 12 aprilde, moet u ‘20130412’ schrijven.

Het artikel Internationale Transact-SQL-verklaringen schrijven uit de documentatie van SQL Server legt uit hoe uitspraken te schrijven die cultuurinvariant zijn:

Applicaties die andere API’s of Transact-SQL-scripts, opgeslagen procedures en triggers gebruiken, moeten de niet-gescheiden numerieke tekenreeksen gebruiken. Bijvoorbeeld jjjjmmdd als 19980924.

BEWERKEN

Aangezien u ADO gebruikt, is de beste optie om de query te parametriseren en de datumwaarde door te geven als een datumparameter. Op deze manier vermijdt u het formaatprobleem volledig en profiteert u ook van de prestatievoordelen van geparametriseerde zoekopdrachten.

UPDATE

Om het ISO 8601-formaat letterlijk te gebruiken, moeten alle elementen worden gespecificeerd. Om te citeren uit de ISO 8601-sectie van de datetime-documentatie

Als u de ISO 8601-indeling wilt gebruiken, moet u elk element in de indeling opgeven. Dit omvat ook de T, de dubbele punten (:) en de punt (.) die in het formaat worden weergegeven.

… de fractie van de tweede component is optioneel. De tijdcomponent wordt gespecificeerd in het 24-uursformaat.


Antwoord 2, autoriteit 37%

Probeer het zo

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

Antwoord 3, autoriteit 14%

Als u alleen vergelijkt met de datumwaarde, zal het converteren naar datum (niet datetime) werken

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)

Deze conversie is ook van toepassing tijdens het gebruik van de functie GetDate()


Antwoord 4, autoriteit 4%

probeer het met onderstaande zoekopdracht

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
convert(datetime, convert(varchar(10), created_date, 102))  <= convert(datetime,'2013-04-12')

Antwoord 5, autoriteit 4%

Je plaatst <= en het zal ook de opgegeven datum vangen. Je kunt het alleen vervangen door <.


Antwoord 6

Datumnotatie is jjjj-mm-dd.
De bovenstaande zoekopdracht is dus op zoek naar records ouder dan 12Apr2013

Stel voor een snelle controle uit te voeren door de datumreeks in te stellen op ‘2013-04-30’, als er geen sql-fout is, wordt de datumnotatie bevestigd op jjjj-mm-dd.


Antwoord 7

Probeer “#” voor en na de datum te gebruiken en zorg ervoor dat je de datumnotatie in je systeem hebt. misschien “JJJJMMDD O JJJJ-MM-DD O MM-DD-JJJJ O GEBRUIK ‘/ O \’ “

Bijvoorbeeld:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#

LEAVE A REPLY

Please enter your comment!
Please enter your name here

15 − one =

Other episodes