Reklama
Nepřihlášený uživatel | Zaregistrovat se
 

Téma:

Počítače a Internet

Spravuje:

koles

Může vás zajímat



Reklama


SQL



timezones popcorn.gif
 
violetelephant グッバイ、ミスターティーポット 
Imo tohle jsou veci co patrej do aplikacni logiky, v podstate to co potrebujes (dopocitany hodnoty) pak posilas jako parametry query. Maximalne si udelas par storek, nebo pohledu, nad tema datama, co akceptujou ty posuny.
gorila Navision je zlo, které se musí vymítit.. 
A kdy budeš testovat přechod ze zimního na letní a z letního na zimní (čas)?
To já vím (a taky vím, co je to za překvapení, když to člověk přenese ze serveru na server a začne se to posouvat, protože pokud je DATEFIRST = 7, tak to nic neposune :)

A pak ještě vyřešit ty zasraný záznamy, co sice spadají do minulého týdne v UTC, ale v lokálním čase ještě ne a mám to hotový :)
violetelephant グッバイ、ミスターティーポット 
to se resi takhle

select datediff(ww, DATEADD(dd,-@@datefirst,@d2), DATEADD(dd,-@@datefirst,@d1))

v podstate z obou dat odectes to co je tvuj datefirst, abys to normalizoval na nedeli
gorila Navision je zlo, které se musí vymítit.. 
Jo takhle, v tomhle případě to používá, ale nefunguje to správně.
Bohužel, zatím jsem nevymyslel lepší způsob, jak zjistit, jestli datum je z tohoto / příštího týdne.....
violetelephant グッバイ、ミスターティーポット 
tak ten mozna, ale zase jak tam pisou, je to kvuli determinismu chovani.

btw. pouzivas datediff week?
DATEDIFF(week, ....)

Nepotřebuje vědět kdy začíná týden?
violetelephant グッバイ、ミスターティーポット 
coze? zrovna datediff je to uplne ukradeny. nebo myslis, ze ma nejaky vliv to kdy zacina tyden na to, jestli mezi rozdil mezi pondeli a patek jsou 4 dny?
gorila Navision je zlo, které se musí vymítit.. 
Eeee, DATEDIFF() počítá rozdíly a nepotřebuje používat DATEFIRST.
No, a tady už si na tenkém ledě - DATEDIFF nastavení DATEFIRST ignoruje a vždy začíná týdny nedělí. ISOWEEK to nepodporuje :(
violetelephant グッバイ、ミスターティーポット 
muzes mrknout tady
https://www.mssqltips.com/sqlservertip/3173/handle-conversion-between-time-zones-in-sql-server--part-1/

jinak add prvni den v tydnu, je to vzdy podle locale settings serveru (OS), u azure databazi (hostovanych) je to vzdy EN_US.

samozrejme nejjednussi je v ramci connection vzdy spustit SET DATEFIRST 1; a pak teprve dalsi query, DATEFIRST ti drzi az do ukonceni spojeni.
Jo, to bych taky rád. Bohužel to potřebuju vyrobit na DB úrovni - mám UTC data a musím průběžně počítat nějaké statistiky (podle aktuálního lokálního času) co se stalo minulý týden a co se stalo tento týden, co se stane příští týden.

A tady nastává to pravé peklo - MSSQL má pro některé funkce prostě první den v týdnu neděli a nehne s tím žádné nastavení. A k tomu je ještě posun na CET time modifikovaný DST. To všechno nad tabulemi s desítkami milionů záznamů.

violetelephant グッバイ、ミスターティーポット 
uprimne, ja vetsinou konverzi UTC na localtime resim na aplikacni vrstve, prave protoze klienti muzou bejt z ruznych mist a data se zpracovavaji ruzne, takze tohle sem jen strelil co jsem nasel.
Tak jsem si rychle ověřil, že CONVERT/CAST z datetimeoffset do datetime2 prostě TZ uřezává (na výstupu potřebuju datetime).
Až SWITCHOFFSET skutečně mění hodnotu data a času.

select CONVERT(datetime,switchoffset(todatetimeoffset(getutcdate(),'+00:00'),datepart(tzoffset,SYSDATETIMEOFFSET())),0),
CONVERT(datetime,TODATETIMEOFFSET(getutcdate(),'+02:00'),0),
CONVERT(datetime,SWITCHOFFSET(getutcdate(),'+02:00'),0)

vrací
13:37
11:37
13:37

A to jsem ještě nezkoušel performance :(
violetelephant グッバイ、ミスターティーポット 
tak ci tak, predpokladam, ze potrebujes pridat offset klienta, ne offset serveru, takze si ho budes muset posilat, a pak pouzijes tohle

https://docs.microsoft.com/en-us/sql/t-sql/functions/todatetimeoffset-transact-sql?view=sql-server-2017

SELECT TODATETIMEOFFSET(datecolumn, '+02:00')

Problem je, že AT TIME ZONE umí až verze 2016 a vyšší :(
violetelephant グッバイ、ミスターティーポット 
co ti na tom prijde divny?

nicmene pozor na vec, GETTIME() jede podle nastaveni casove zony serveru. asi lepsi reseni je pouzivat convert, protoze tam si muzes dat jakou TZ chces, takze si ji tam klidne procpes pres parametr od klienta

timezone je lepsi minimalne protoze uzivatel napriklad muze byt v CEST, server je hostovany v irsku, takze je GMT .... no a .... mas problem zase :D

SELECT CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, dateTimeField AT TIME ZONE 'Central European Standard Time')))

https://docs.microsoft.com/en-us/sql/t-sql/queries/at-time-zone-transact-sql?view=sql-server-2017
violetelephant グッバイ、ミスターティーポット 
co ti na tom prijde divny?

nicmene pozor na vec, GETTIME() jede podle nastaveni casove zony serveru. asi lepsi reseni je pouzivat convert, protoze tam si muzes dat jakou TZ chces, takze si ji tam klidne procpes pres parametr od klienta

select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET,
dateTimeField AT TIME ZONE 'Eastern Standard Time')))

timezone je lepsi minimalne protoze uzivatel napriklad muze byt v CEST, server je hostovany v irsku, takze je GMT .... no a .... mas problem zase :D

SELECT CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, dateTimeField AT TIME ZONE 'Central European Standard Time')))

https://docs.microsoft.com/en-us/sql/t-sql/queries/at-time-zone-transact-sql?view=sql-server-2017