Jump to content

Recommended Posts

Posted

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.

Posted (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 by FreiNando

O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.