Poistetaan aikavyöhykepoikkeama DateTimeOffsetista. Aikavyöhykepoikkeaman poistaminen DateTimeOffsetista Null date offset sql server

DateTimeOffset testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32, new Timespan(1, 0, 0)); //PUHDISTUSAIKA JA PÄIVÄMÄÄRÄ testDateAndTime = testDateAndTime.DateTime.Date; var datesTableEntry = db.Päivämäärätaulukko.Ensin(dt => dt.Id == someTestId); datesTableEntry.test= testDateAndTime; db.SaveChangesAsync();

TULOS TIETOKANNASSA: 2008-05-01 00:00:00.0000000 -04:00

Kuinka ottaa käyttöön -4:00 - +00:00 (koodista ennen tallennusta)?

Olen yrittänyt:

Julkinen tehtävä SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj) ( Timespan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0); paluupäivämääräTimeOffSetObj.ToOffset(zeroOffsetTimeSpan); )

Hän ei tee mitään.

Lopullisena tavoitteena on yksinkertaisesti olla päivämäärä ilman aika- tai aikavyöhykepoikkeamaa. EN halua muuntaa aikaa toiselle aikavyöhykkeelle (esim. 00:00:00.0000000 En halua, että se vähentää 4 tuntia 00:00:00.0000000 ajasta ja 00:00:00.0000000 siirtää asetettua aikaa +00 :00, haluan vain, että se asettaa offsetin arvoon +00:00). Haluan nykyinen päivämäärä nollapoikkeamalla.

Muokata:

Tässä on mitä voit tarjota muualla:

DateTimeOffset testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32, new Timespan(1, 0, 0)); testDateAndTime = testDateAndTime.DateTime.Date; //Zero out time osa testDateAndTime = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc); //"Zero out" offset-osio

Olin varma, että SpecifyKind määrittelisi dateTimeOffsetini, kuten muuttaisi SEKA-aikaa ja aikavyöhykepoikkeamaa, mutta testattaessa se näyttää vain muuttavan aikavyöhykepoikkeamaa, mitä haluan. Onko tässä ongelma?

1 vastaus

Ongelmalla ei ole mitään tekemistä tietokannan kanssa. Jos asetat keskeytyskohdan tai rekisteröit lähdön jonnekin, sinun pitäisi nähdä siirtymän olevan sidottu pian tämän koodin jälkeen:

TestDateAndTime = testDateAndTime.DateTime.Date;

Puretaan se:

  • Aloitit DateTimeOffsetilla 2008-05-01T08:06:32+01:00
  • Soitit sitten .DateTime -arvoksi, jolloin DateTime-arvoksi tuli 2008-05-01T08:06:32 ja DateTimeKind.Unspecified.
  • Soitit sitten .Date, mikä johti DateTime-arvoon 2008-05-01T00:00:00 ja DateTimeKind.Unspecified.
  • Palautat tuloksen testDateAndTimessa, joka on tyyppiä DateTimeOffset . Tämä aiheuttaa implisiittisen muunnoksen DateTimesta DateTimeOffsetiksi joka soveltaa paikallista aikavyöhykettä. Sinun tapauksessasi näyttää siltä, ​​että tämän arvon siirtymä paikallisella aikavyöhykkeelläsi on -04:00, joten tuloksena oleva arvo on DateTimeOffset 2008-05-01T00:00:00-04:00, kuten kuvailit,

Sinä sanoit:

Lopullisena tavoitteena on yksinkertaisesti olla päivämäärä ilman aika- tai aikavyöhykepoikkeamaa.

No, tällä hetkellä ei ole olemassa natiivia C#-tietotyyppiä, joka olisi vain päivämäärä ilman aikaa. Corefxlabin System.Time-paketissa on puhdas päivämäärätyyppi, mutta se ei ole aivan valmis tyypilliseen tuotantosovellukseen. Nodan aikakirjastossa on LocalDate, jota voit käyttää tänään, mutta sinun on silti muutettava takaisin alkuperäiseen tyyppiin ennen kuin tallennat tietokantaan. Joten sillä välin parasta, mitä voit tehdä, on:

  • Vaihda SQL-palvelin käyttämään päivämäärätyyppiä tässä kentässä.
  • Käytä .NET-koodissasi DateTimea, jonka aika on 00:00:00 ja DateTimeKind.Unspecified. Sinun täytyy muistaa jättää huomioimatta aikaosa (koska tietyillä aikavyöhykkeillä on päivämääriä ilman paikallista keskiyötä).
  • Vaihda testihälytykseksi DateTime DateTimeOffsetin sijaan.

Yleisesti ottaen DateTimeOffset sopii useisiin skenaarioihin (kuten aikaleimatapahtumiin), mutta se ei sovellu vain päivämäärän arvoille.

Haluan nykyisen päivämäärän nollasiirrolla.

Jos todella haluat sen kuten DateTimeOffset, toimi seuraavasti:

TestiPvmJaAika = new DateTimeOffset(testiPvmJaAika.Pvm, TimeSpan.Zero);

En kuitenkaan suosittele tätä. Tekemällä tämän otat alkuperäisen arvon paikallisen päivämäärän ja väität, että se on UTC:ssä. Jos alkuperäinen offset on jokin muu kuin nolla, tämä on väärä lausunto. Se johtaa myöhemmin muihin virheisiin, koska itse asiassa puhut eri ajankohdasta (mahdollisesti eri päivämäärästä) kuin luomasi.

Mitä tulee lisäkysymys määrittämäsi muokkauksessa - DateTimeKind.Utc:n määrittäminen muuttaa implisiittisen castin käyttäytymistä. Paikallisen aikavyöhykkeen sijaan käytetään UTC-aikaa, jolla on aina nollapoikkeama. Tulos on sama kuin yllä antamani selkeämpi näkemys. Suosittelen edelleen olemaan tätä vastaan ​​samoista syistä.

Katsotaanpa esimerkkiä alkamisesta 2016-12-31T22:00:00-04:00. Lähestymistavan mukaan sinun tulee tallentaa tietokantaan 2016-12-31T00:00:00+00:00. Nämä ovat kuitenkin kaksi eri ajankohtaa. Ensimmäinen, UTC:ksi normalisoitu, olisi 2017-01-01T02:00:00+00:00, ja toinen, muutettuna toiselle aikavyöhykkeelle, olisi 2016-12-30T20:00:00-04:00. Huomaa muutoksen päivämäärät. Tämä ei todennäköisesti ole käyttäytymistä, jota haluaisit hakemuksessasi.

Inhimillinen vaihtoehto ([sinun täytyy rekisteröityä nähdäksesi linkin]).

Ongelman ydin on tämä. Jos otit vahingossa käyttöön tietokannan SQL-palvelimelle, jonka "päivämääräsiirtymä" on 0, ongelma syntyy, kun tietokanta sisältää attribuutin, jonka tyyppi on TIME, eli tämä attribuutti on 01. /01/0001 10:30:00 tai tyhjä rekisteröintipäivä 01.01.0001 00:00:00. Kun tallennat tällaisia ​​tietoja, niitä ei tallenneta.
Internetissä he tarjoavat luoda uusi pohja vähennyksellä 2000.
Mutta en todellakaan halunnut luoda uutta perustaa. Ja muuta polku tietokantaan kaikille käyttäjille.
Sitten seurasin polkua, missä tämä arvo on tallennettu SQL: ään. Löysin sen ja vaihdoin sen 2000 ja kaikki oli ok.
Ja nyt askel askeleelta mihin muuttaa.

Potkaise kaikki käyttäjät.

HUOMIO!!!

1. Tee se ensin varmuuskopio 1C:n avulla eli lataa se osoitteeseen *.dt
Tämä on tehtävä ennen "offsetin" muuttamista
Jos tätä ei tehdä, koko tietokannassasi on viitteitä, asiakirjoja jne.
missä on vaatimus, päivämäärä on esimerkiksi 02.10.0009
MITÄ EI OLE SALLIA...
Joten olet ladannut tiedostoon *.dt

2. Siirry SQL Server Management Studioon
Etsi tukikohtasi luettelosta ja paina plusmerkkiä.
Etsi sieltä "Tables" -kansio ja avaa se.
Joukko pöytiä avautuu, mene aivan pohjaan, etsi pöytä
_YearOffset, seiso sen päällä ja valitse oikealla painikkeella kohta "Avaa pöytä", katso kuva 1
Muuta arvo 0 arvoon 2000
Sulje SQL Server Management Studio

3. Siirry konfiguraattoriin ja lataa aiemmin tallennettu tietokanta.

Jos tätä ei tehdä, kaikki päivämäärät ovat vuodella 0009.
Kun tietokanta on latautunut... Voit siirtyä kohtaan 1C ja varmistaa, että päivämäärät ovat normaaleja.
Tuloksena on, että muutimme "päivämäärän siirtymän 0:sta 2000:een"

Joskus käy niin, että tätä vaihtoehtoa ei voida käyttää syystä tai toisesta. Sitten on vaikeampi vaihtoehto ([sinun täytyy rekisteröityä nähdäksesi linkin]):

Ilmoita TablesAndFields-kursori kohteelle

VALITSE objektit.nimi taulukon nimeksi, sarakkeet.nimi sarakkeen nimeksi
FROM dbo.sysobjects kuten esineitä
vasemmalle liity dbo.syscolumns sarakkeina objektiin.id = columns.id
jossa objektit.xtyyppi = "U" ja sarakkeet.xtyyppi = 61

avaa TablesAndFields

WHILE @@FETCH_STATUS = 0
BEGIN Exec(" päivittää"+ @TableName + "
aseta " + @SarakkeenNimi + " = ""2000- 01- 01 00:00:00" "
missä " + @SarakkeenNimi + " > ""3999- 12- 31 23:59:59" "")

Tätä suoritetaan niin kauan kuin edellinen haku onnistuu.
HAE SEURAAVA TablesAndFieldsistä kenttään @TableName, @ColumnName
LOPPU

sulje TablesAndFields
deallocateTablesAndFields
mennä

Älä unohda kopioida tietokantoja ennen manipulointia!

Ongelmalla ei ole mitään tekemistä tietokannan kanssa. Jos asetat keskeytyskohdan tai syötät lähdön jonnekin, sinun pitäisi pystyä näkemään siirtymän napsauttavan pian tämän koodin jälkeen:

TestDateAndTime = testDateAndTime.DateTime.Date;

Puretaan se:

  • Aloitit DateTimeOffset-arvolla 2008-05-01T08:06:32+01:00
  • Soitit sitten .DateTime , mikä johti arvon DateTime 2008-05-01T08:06:32 kanssa DateTimeKind.Unspecified.
  • Soitit sitten .Date, mikä johti DateTime-arvoon 2008-05-01T00:00:00 ja DateTimeKind.Unspecified.
  • Määrität tuloksen testDateAndTimelle, joka on tyyppiä DateTimeOffset. Tämä aiheuttaa implisiittisen heiton DateTimesta DateTimeOffsetiin - , joka pätee paikallinen Aikavyöhyke. Sinun tapauksessasi näyttää siltä, ​​että tämän arvon siirtymä paikallisella aikavyöhykkeelläsi on -04:00 , joten tuloksena oleva arvo on DateTimeOffset 2008-05-01T00:00:00-04:00 kuvailemallasi tavalla.

Sinä sanoit:

Lopullisena tavoitteena on yksinkertaisesti olla päivämäärä ilman aika- tai aikavyöhykepoikkeamaa.

No, siellä on tällä hetkellä ei natiivi C#-tietotyyppi, joka on vain päivämäärä ilman aikaa Järjestelmän aika paketti corefxlabissa, mutta se ei ole vielä aivan valmis tyypilliseen tuotantosovellukseen. Noda Time -kirjastossa on LocalDate, jota voit käyttää tänään, mutta sinun on silti muutettava takaisin alkuperäiseen tyyppiin ennen kuin tallennat tietokantaan. Joten sillä välin parasta, mitä voit tehdä, on:

  • Vaihda SQL-palvelin käyttämään päivämäärätyyppiä kentässä.
  • Käytä .NET-koodissasi DateTimea, jonka aika on 00:00:00 ja DateTimeKind.Unspecified. Sinun täytyy muistaa jättää huomioimatta aikaosa (koska tietyillä aikavyöhykkeillä on päivämääriä ilman paikallista keskiyötä).
  • Muuta testiehdotus DateTime-arvoksi DateTimeOffsetin sijaan.

Yleisesti ottaen DateTimeOffset sopii useisiin skenaarioihin (esim aikaleimat tapahtumat), se ei sovi hyvin vain päivämäärän arvoille.

Haluan nykyisen päivämäärän nollasiirrolla.

Jos sinä haluta todella Se on kuin DateTimeOffset, voit tehdä:

TestiPvmJaAika = new DateTimeOffset(testiPvmJaAika.Pvm, TimeSpan.Zero);

En kuitenkaan suosittele tekemään tätä. Tekemällä tämän otat paikallinen alkuperäisen arvon päivämäärä ja väitä, että se on UTC. Jos alkuperäinen offset on jokin muu kuin nolla, tämä on väärä lausunto. Se johtaa myöhemmin muihin virheisiin, koska itse asiassa puhut eri ajankohdasta (mahdollisesti eri päivämäärästä) kuin luomasi.

Mitä tulee lautakunnallesi esitettyyn lisäkysymykseen. DateTimeKind.Utc:n määrittäminen muuttaa implisiittisen castin käyttäytymistä. Paikallisen aikavyöhykkeen sijaan käytetään UTC-aikaa, jolla on aina nollapoikkeama. Tulos on sama kuin yllä antamani selkeämpi näkemys. Suosittelen edelleen olemaan tätä vastaan ​​samoista syistä.

Harkitse esimerkkiä, joka alkaa 2016-12-31T22:00:00-04:00. Lähestymistapasi mukaan sinun tulee tallentaa tietokantaan 2016-12-31T00:00:00+00:00. Nämä ovat kuitenkin kaksi eri ajankohtaa. Ensimmäinen, UTC:ksi normalisoitu, olisi 2017-01-01T02:00:00+00:00, ja toinen, muutettuna toiselle aikavyöhykkeelle, olisi 2016-12-30T20:00:00-04:00. Huomaa muutoksen päivämäärät. Tämä ei todennäköisesti ole käyttäytymistä, jota haluaisit hakemuksessasi.

Aiheeseen liittyviä julkaisuja