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

Ik probeerde als volgt een tabel te maken,

create table table1(date1 datetime,date2 datetime);

Eerst probeerde ik waarden in te voegen zoals hieronder,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Er is een fout opgetreden bij het zeggen,

Kan varchar niet converteren naar datetime

Toen probeerde ik het onderstaande formaat als een van de berichten die door onze stackoverflow werden gesuggereerd,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Maar ik krijg nog steeds de foutmelding:

Conversie mislukt bij conversie van datum en/of tijd uit tekenreeks

Heeft u suggesties?


Antwoord 1, autoriteit 100%

Er worden veel indelingen ondersteund door SQL Server – zie de MSDN Books Online on CAST en CONVERTEREN. De meeste van die indelingen zijn afhankelijkvan 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 datumformaatte gebruiken dat wordt ondersteund door SQL Server – dit formaat werkt altijd– ongeacht uw Taal- en datumnotatie-instellingen van SQL Server.

De ISO-8601-indelingwordt ondersteund door SQL Server wordt geleverd in twee smaken:

  • YYYYMMDDvoor alleen datums (geen tijdsdeel); let hier op: geen streepjes!, dat is erg belangrijk! YYYY-MM-DDis NIETonafhankelijk van de datumnotatie-instellingen in uw SQL Server en zal NIETin alle situaties werken!

of:

  • YYYY-MM-DDTHH:MM:SSvoor datums en tijden – let hier op: dit formaat heeftstreepjes (maar ze kunnenweggelaten), en een vaste Tals 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: u moet hiervoor de internationale 24-uurs-notatie gebruiken in plaats van de 12-uur AM/PM-notatie).

Alternatief: als u SQL Server 2008of nieuwer gebruikt, kunt u ook het gegevenstype DATETIME2gebruiken (in plaats van gewone DATETIME) en je huidige INSERTzou gewoon werken zonder problemen! 🙂 DATETIME2is 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-indeling zou het goed moeten zijn voor elke versie van SQL Server en voor elke taal- en datumindeling in uw SQL Server.


Antwoord 2, autoriteit 16%

De conversie in de SQL-server mislukt soms, niet vanwege de gebruikte datum- of tijdnotaties, maar alleen omdat u probeert verkeerde gegevens op te slaan die niet acceptabel zijn voor het systeem.

Voorbeeld:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

De SQL-server geeft de volgende foutmelding:

Conversion failed when converting date and/or time from character string.

De reden voor deze fout is simpelweg dat er geen datum (29 februari) is in het jaar (2015).


Antwoord 3, autoriteit 10%

Eenvoudig antwoord – 5 is Italiaans “yy” en 105 is Italiaans “yyyy”. Daarom:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

werkt correct, maar

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

geeft een foutmelding.

Evenzo,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

geeft een fout, waarbij als

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

zal werken.


Antwoord 4, autoriteit 5%

Waar mogelijk moet men cultuurspecifieke datum-/tijdletters vermijden.

Er zijn enkele veiligeindelingen om een letterlijke datum/tijd op te geven:

Alle voorbeelden voor 2016-09-15 17:30:00

ODBC (mijn favoriet, zoals het wordt afgehandeld als het echt type onmiddellijk)

  • {ts'2016-09-15 17:30:00'}– Term Stamp
  • {d'2016-09-15'}– ALLEEN
  • {t'17:30:00'}– Tijdige

ISO8601 (het beste voor overal )

  • '2016-09-15T17:30:00'– bewust van de Tin het midden!

Ongereineerd (klein risico om verkeerd te worden geïnterpreteerd als getal)

  • '20160915'– Verenigd Koninkrijk voor PURE DATUM

Goed om in gedachten te houden: Ongeldige datums hebben de neiging om te komen met Vreemde fouten

  • Er is geen 31 juni of 30 februari …

Nog een reden voor vreemde conversiefouten: volgorde van uitvoering!

SQL-Server is bekend om dingen te doen in een volgorde van uitvoering die men misschien niet had verwacht. Uw schriftelijke verklaring lijkt erop dat de conversie wordt uitgevoerd vóór Sommige typesgerelateerde actie vindt plaats, maar de motor beslist – waarom ooit – om de conversie in een latere stap te doen.

Hier is een geweldig artikel dat dit met voorbeelden uitlegt: RUSANO.COM:” T-SQL-FUNCTION-DO-NO-implly-a-sfficy-of-uitvoering “en hier is De gerelateerde vraag .


Antwoord 5, Autoriteit 4%

Update gewoon het datumformaat zoals ook als daaronder staan ​​

yyyy-MM-dd hh:MM:ss

Het lost het probleem op voor mij en het werkt prima


Antwoord 6, Autoriteit 2%

De beste manier is deze code

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

Antwoord 7, autoriteit 2%

Ik heb dit geprobeerd en het werkt bij mij:

SELECT CONVERT(date, yourDate ,104)

Antwoord 8

convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

Antwoord 9

Het datetime-formaat dat daadwerkelijk op de sql-server draait, is

yyyy-mm-dd hh:MM:ss

Antwoord 10

Probeer dit.

SQL Server verwacht datums in MM/DD/JJJJ-indeling, als Engels is ingesteld als uw standaardtaal. Hier sla ik datepicker-waarde op in sql2008-database. Mijn veldtype is datetime in database.dpdob is mijn datepicker-naam.

          Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Gebruik nu dob in uw invoegquery.


Antwoord 11

Ik had dit probleem bij het samenvoegen van getdate()in een string die ik invoegde in een nvarchar-veld.

Ik heb wat casting gedaan om het te omzeilen:

INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Dat is een geschonden voorbeeld. Het sleutelgedeelte ervan is:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Gegoten de datum als datetime2, dan als nvarcharom het aan te voegen.


Antwoord 12

U kunt deze code proberen

select (Convert(Date, '2018-04-01'))

Antwoord 13

Hiermee is het eenvoudig om te converteren van een ISO-string naar een SQL-server datetime:

INSERT INTO time_data (ImportateDateTime) VALUES (CAST(CONVERT(datetimeoffset,'2019-09-13 22:06:26.527000') AS datetime))

Bron HTTPS: // www. sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html


Antwoord 14

Voor mij werkte dit:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')

Antwoord 15

Cultuur in het Engels instellen van Web.Config-bestand

 <globalization uiCulture="en-US" culture="en-US" />

Als u de cultuur bijvoorbeeld instelt op Arabisch, is de tijd

22/09/2017 02:16:57 ص

en je krijgt de foutmelding:Conversie mislukt bij het converteren van datum en/of tijd uit tekenreeks tijdens het invoegen van datetime

Other episodes