maurosmartins Posted October 17, 2012 at 11:36 AM Report #479470 Posted October 17, 2012 at 11:36 AM Bom dia a todos, de algum tempo para cá tenho estado a trabalhar em VBA (Excel) para que em conjunto com uma base de dados SQL server gere uns relatórios automaticamente. Tudo bem até ao facto de que a base de dados guarda as datas em UTC e eu necessito de ver os dados na base temporal local. Por exemplo, se seleccionar todos os dados de um dia entre as "2012-08-01 00:00:00:000" e "2012-08-01 23:59:00:000" (locais) não vão ser os dados correctos, pois necessito de converter a minha data local para UTC e ter em considerão o DST (horário de verão) da localização de onde a data provem. Assim o que gostaria de perguntar é se na própria "query" poderia fazer algo do género: seleccionar todos_os_dados da tabelaX onde data entre converteUTC(data_local_inicial) e converteUTC(data_local_final) Esse conveteUTC teria de ter em consideração o horario de verao. Por exemplo italia seria UTC+1 ou +2 horas conforme esteja ou nao em horario de verao. também seria interessante fazer ao contrario, ou seja ter uma data expressa em UTC e saber qual a correspondente em data local. Se tiverem sugestoes agradecia-vos mto, desde já obrigado, Mauro.
FreiNando Posted October 23, 2012 at 08:35 PM Report #480153 Posted October 23, 2012 at 08:35 PM (edited) Com até agora ninguém te deu nenhuma dica, deixo-te o código VBA com essa funções de conversão entre Local e UTC. Tenho-as usado há anos e funcionam corretamente de acordo com as definições regionais. 'Declarações para obter e converter datas UTC e de sistema Public Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Public Type TIME_ZONE_INFORMATION Bias As Long StandardName(0 To 31) As Integer StandardDate As SYSTEMTIME StandardBias As Long DaylightName(0 To 31) As Integer DaylightDate As SYSTEMTIME DaylightBias As Long End Type Public Declare Function SystemTimeToTzSpecificLocalTime Lib "kernel32" _ (lpTimeZoneInformation As TIME_ZONE_INFORMATION, _ lpUniversalTime As SYSTEMTIME, lpLocalTime As SYSTEMTIME) As Long Public Declare Function TzSpecificLocalTimeToSystemTime Lib "kernel32" _ (lpTimeZoneInformation As TIME_ZONE_INFORMATION, _ lpLocalTime As SYSTEMTIME, lpUniversalTime As SYSTEMTIME) As Long Public Declare Function GetTimeZoneInformation Lib "kernel32" _ (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long '=================================================================== Public Function DataUtc(LocalData As Date) As Date Dim Dz As TIME_ZONE_INFORMATION GetTimeZoneInformation Dz Dim Dlocal As SYSTEMTIME Dim Dutc As SYSTEMTIME Dlocal.wYear = Year(LocalData) Dlocal.wMonth = Month(LocalData) Dlocal.wDay = Day(LocalData) Dlocal.wHour = Hour(LocalData) Dlocal.wMinute = Minute(LocalData) Dlocal.wSecond = Second(LocalData) TzSpecificLocalTimeToSystemTime Dz, Dlocal, Dutc DataUtc = DateSerial(Dutc.wYear, Dutc.wMonth, Dutc.wDay) _ + TimeSerial(Dutc.wHour, Dutc.wMinute, Dutc.wSecond) End Function Public Function DataLocal(UtcData As Date) As Date Dim Dz As TIME_ZONE_INFORMATION GetTimeZoneInformation Dz Dim Dutc As SYSTEMTIME Dim Dlocal As SYSTEMTIME Dutc.wYear = Year(UtcData) Dutc.wMonth = Month(UtcData) Dutc.wDay = Day(UtcData) Dutc.wHour = Hour(UtcData) Dutc.wMinute = Minute(UtcData) Dutc.wSecond = Second(UtcData) SystemTimeToTzSpecificLocalTime Dz, Dutc, Dlocal DataLocal = DateSerial(Dlocal.wYear, Dlocal.wMonth, Dlocal.wDay) _ + TimeSerial(Dlocal.wHour, Dlocal.wMinute, Dlocal.wSecond) End Function Edited October 23, 2012 at 08:39 PM by FreiNando O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now