sql >> Database >  >> RDS >> Sqlserver

Conversie mislukt bij het converteren van datum en/of tijd van tekenreeks tijdens het invoegen van datetime

Er worden veel formaten ondersteund door SQL Server - zie de MSDN Books Online over CAST en CONVERT. De meeste van die indelingen zijn afhankelijk op welke instellingen je hebt - daarom kunnen deze instellingen soms werken - en soms niet.

De manier om dit op te lossen is door het (enigszins aangepaste) ISO-8601 datumformaat te gebruiken dat wordt ondersteund door SQL Server - dit formaat werkt altijd - ongeacht uw SQL Server-taal en datumnotatie-instellingen.

De ISO-8601-indeling wordt ondersteund door SQL Server en is er in twee smaken:

  • YYYYMMDD voor alleen data (geen tijdgedeelte); noteer hier:geen streepjes! , dat is heel belangrijk! YYYY-MM-DD is NIET onafhankelijk van de datumnotatie-instellingen in uw SQL Server en zal NIET werk in alle situaties!

of:

  • YYYY-MM-DDTHH:MM:SS voor datums en tijden - let hier op:dit formaat heeft streepjes (maar ze kunnen worden weggelaten), en een vaste T als scheidingsteken tussen het datum- en tijdgedeelte van uw DATETIME .

Dit is geldig voor SQL Server 2000 en nieuwer.

Dus in jouw specifieke geval - gebruik deze strings:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

en het zou goed moeten komen (let op:je moet de internationale 24-uurs gebruiken formaat in plaats van het 12-uurs AM/PM-formaat hiervoor).

Alternatief :als je SQL Server 2008 gebruikt of nieuwer, u kunt ook de DATETIME2 . gebruiken datatype (in plaats van gewoon DATETIME ) en uw huidige INSERT zou gewoon werken zonder problemen! :-) DATETIME2 is een stuk beter en veel minder kieskeurig bij conversies - en het zijn sowieso de aanbevolen datum/tijd-gegevenstypen voor SQL Server 2008 of nieuwer.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

Vraag me niet waarom dit hele onderwerp zo lastig en enigszins verwarrend is - zo is het gewoon. Maar met de YYYYMMDD formaat, je zou in orde moeten zijn voor elke versie van SQL Server en voor elke taal- en datumindeling in je SQL Server.



  1. Hoe JSON-gegevens op te halen uit MySQL?

  2. Versleutel wachtwoord in R - om verbinding te maken met een Oracle DB met behulp van RODBC

  3. Geaggregeerde functies gebruiken (SUM, AVG, MAX, MIN, COUNT, DISTINCT) in MySQL

  4. Hoe verander ik de MySQL-tijdzone in een databaseverbinding met Java?