Une autre problématique dès que l'on travaille sur plusieurs bases (Access, Sql Server, Oracle) et que l'on est confronté à des langues différentes au niveau des serveurs... Même le LCID = 1036 (qui permet d'imposer la langue utilisée par le serveur web) ne vient pas à bout de certaines architectures ! En plus la syntaxe SQL de la langue n'est pas identique selon les bases. Donc pour éviter de voir le 7 mai se transformer en 5 juillet, voilà une solution, l'utilisation du format ODBC compatible avec les trois bases citées :
L'idée est de transformer un format de date jj/mm/aaaa ou mm/dd/yyyy en un format identique : {d 'aaaa-mm-jj} {d 'yyyy-mm-dd} ou un format comportant les heures : {ts 'yyyy-mm-dd hh:mm:ss'} ou {ts 'aaaa-mm-jj hh:mm:ss'}
La requête SQL devient "... WHERE champ > {d '2006-08-23} "
'****************************************************************************************************
' Fonction : strODBCDate
' Objet : Preparer l'insertion d'une date dans une requete SQL
' Entrée :
' - dtmParam : date a traiter
' Retour : chaine a inserer directement dans le code SQL
' Sortie :
' Commentaires : le format final est {d 'aaaa-mm-jj'}
' quelle que soit la langue d'installation de la base cible
' Exemple :
'****************************************************************************************************
Function strODBCDate(ByVal dtmParam)
Dim strOut
If IsNull(dtmParam) Or dtmParam="" Then
strOut = Null
Else
If Not IsDate(dtmParam) Then
strOut = Null
Else
Dim strMonth, strDay
Dim dtmMonth, dtmDay
' Traitement du mois si sur un seul chiffre
dtmMonth = Month(dtmParam)
If dtmMonth<10 Then
strMonth = "0" & CStr(dtmMonth)
Else
strMonth = CStr(dtmMonth)
End If
' Traitement du jour si sur un seul chiffre
dtmDay = Day(dtmParam)
If dtmDay<10 Then
strDay = "0" & CStr(dtmDay)
Else
strDay = CStr(dtmDay)
End If
' Creation de la chaine de retour
strOut = "{d '" & CStr(Year(dtmParam)) & "-" & strMonth & "-" & strDay & "'}"
End If
End If
strODBCDate = strOut
End Function
'=======================================================================================
' Fonction : strODBCDateTime
' Objet : Preparer l'insertion d'une date dans une requete SQL
' Entrée :
' - dtmParam : date et heure a traiter
' Retour : chaine a inserer directement dans le code SQL
' Sortie :
' Commentaires : le format final est {ts 'aaaa-mm-jj hh:mm:ss'}
' quelle que soit la langue d'installation de la base cible
' Exemple :
'=======================================================================================
Function strODBCDateTime(ByVal dtmParam)
Dim strOut
If IsNull(dtmParam) Or dtmParam="" Then
strOut = Null
Else
If Not IsDate(dtmParam) Then
strOut = Null
Else
Dim strMonth, strDay
Dim dtmMonth, dtmDay
Dim strHour, strMinutes, strSecondes
strHour =hour(dtmParam)
strMinutes= minute(dtmParam)
strSecondes = second(dtmParam)
' Traitement du mois si sur un seul chiffre
dtmMonth = Month(dtmParam)
If dtmMonth<10 Then
strMonth = "0" & CStr(dtmMonth)
Else
strMonth = CStr(dtmMonth)
End If
' Traitement du jour si sur un seul chiffre
dtmDay = Day(dtmParam)
If dtmDay<10 Then
strDay = "0" & CStr(dtmDay)
Else
strDay = CStr(dtmDay)
End If
If strHour<10 Then
strHour = "0" & CStr(strHour)
Else
strHour = CStr(strHour)
End If
If strMinutes<10 Then
strMinutes = "0" & CStr(strMinutes)
Else
strMinutes = CStr(strMinutes)
End If
If strSecondes<10 Then
strSecondes = "0" & CStr(strSecondes)
Else
strSecondes = CStr(strSecondes)
End If
' Creation de la chaine de retour
strOut = "{ts '" & CStr(Year(dtmParam)) & "-" & strMonth & "-" & strDay & " "& strHour & ":"& strMinutes & ":"& strSecondes&"'}"
End If
End If
strODBCDateTime = strOut
End Function