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#