Yritin luoda taulukon seuraavasti,
create table table1(date1 datetime,date2 datetime);
Ensin yritin lisätä arvoja seuraavasti,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Se on antanut virheilmoituksen,
Cannot convert varchar to datetime
Sitten kokeilin alla olevaa muotoa, kuten yksi stackoverflow'n ehdottamista viesteistä,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Mutta saan edelleen virheilmoituksen,
Muunnos epäonnistui muunnettaessa päivämäärää ja/tai kellonaikaa merkkijonosta.
Onko ehdotuksia?
SQL Server tukee monia formaatteja - katso MSDN Books Online on CAST and CONVERT. Useimmat näistä formaateista ovat riippuvaisia siitä, mitä asetuksia sinulla on käytössäsi - siksi nämä asetukset saattavat toimia joskus - ja joskus eivät.
Ratkaisu tähän on käyttää (hieman mukautettua) ISO-8601-päivämäärämuotoa, jota SQL Server tukee - tämä muoto toimii aina - riippumatta SQL Serverin kieli- ja päivämäärämuotoasetuksista.
SQL Server tukee ISO-8601-formaattia kahdella eri tavalla:
YYYYMMDD
pelkkiä päivämääriä varten (ilman aikaosaa); huom. tässä: ei katkoviivoja!, se on erittäin tärkeää! YYYY-MM-DD
ei ole riippumaton SQL Serverin päivämäärämuotoasetuksista ja ei toimi kaikissa tilanteissa!tai:
T
erottimena päivämäärän ja kellonajan välillä DATETIME
-osiossa.Tämä on voimassa SQL Server 2000:ssa ja uudemmissa versioissa.
Konkreettisessa tapauksessasi käytä siis näitä merkkijonoja:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
ja sinun pitäisi olla kunnossa (huomaa: sinun on käytettävä kansainvälistä 24-tunnin muotoa eikä 12-tunnin AM/PM-muotoa).
Vaihtoehtoisesti: jos käytät SQL Serveriä 2008 tai uudempaa, voit myös käyttää DATETIME2
-tietotyyppiä (pelkän DATETIME
-tietotyypin sijasta) ja nykyinen INSERT
-tietotyyppisi toimisi ongelmitta! :-) DATETIME2
on paljon parempi ja paljon vähemmän nirso muunnosten suhteen - ja se on muutenkin suositeltava päivämäärän ja ajan tietotyyppi SQL Server 2008:lle tai uudemmille.
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
Älä kysy minulta, miksi tämä koko aihe on niin hankala ja hieman sekava - niin se vain on. Mutta YYYYMMDD
-formaatin pitäisi olla kunnossa kaikissa SQL Server -versioissa ja kaikissa SQL Serverin kieli- ja päivämäärämuotoasetuksissa.
Muunnos SQL-palvelimessa epäonnistuu joskus, koska päivämäärän tai ajan formaatteja käytetään, Se on vain siksi, että yrität tallentaa vääriä tietoja, joita järjestelmä ei hyväksy.
Esimerkki:
Luo taulukko MyTable (MyDate);
Sisää taulukkoon MyTable(MyDate) arvot ('2015-02-29');
SQL-palvelin antaa seuraavan virheilmoituksen:
`Muunnos epäonnistui muunnettaessa päivämäärää ja/tai kellonaikaa merkkijonosta.
Tämä virhe johtuu yksinkertaisesti siitä, että kyseistä päivämäärää (29.2.) ei ole vuonna (2015).
Yksinkertainen vastaus - 5 on italialainen "yy" ja 105 on italialainen "yyyy". Siksi:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
toimii oikein, mutta
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
antaa virheen.
Samoin,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
antaa virheen, kun taas
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
toimii.