Datum uit MSSQL converteren naar dd-mm-jjjj

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nick Nurmodeluxe

Nick Nurmodeluxe

14/08/2012 16:38:02
Quote Anchor link
Beste mensen,
Ik heb de onderstaande code uitgevoerd om een MSSQL datumformaat als 0x00009BA100000000 te converteren naar een MYSQL formaat zoals 00-00-0000 00:00:00. Maar als ik deze code uitvoer, wordt er geen datum ge-output.
Hoe kan dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
mysql_connect ("********","*******", "********");
mysql_select_db ("*****");
$string = "0x00009BA100000000";
$query = mysql_query("SELECT
CAST(
'1900-01-01 00:00:00' +
INTERVAL CAST(CONV(substr(HEX(BinaryData),1,8), 16, 10) AS SIGNED) DAY +
INTERVAL CAST(CONV(substr(HEX(BinaryData),9,8), 16, 10) AS SIGNED)* 10000/3 MICROSECOND
AS DATETIME) AS converted_datetime
FROM
(
SELECT '"
.$string."' AS BinaryData
) d"
);
while ($obj = mysql_fetch_object($query)) {
echo $obj->converted_datetime;
}

?>
Gewijzigd op 14/08/2012 16:38:56 door Nick Nurmodeluxe
 
PHP hulp

PHP hulp

22/12/2024 15:56:46
 
- Ariën  -
Beheerder

- Ariën -

14/08/2012 16:39:45
Quote Anchor link
regel 15 hoort er niet in.
 
Erwin H

Erwin H

14/08/2012 16:44:38
Quote Anchor link
Je zegt dd-mm-jjjj en '00-00-0000 00:00:00' maar mysql format is jjjj-mm-dd. Ik weet niet of dat goed gaat met je conversie, maar als je het verwacht zoals in je topic titel dan denk ik dat het niet gaat werken.
 
Nick Nurmodeluxe

Nick Nurmodeluxe

14/08/2012 16:44:52
Quote Anchor link
Dat heb ik geprobeerd, samen met regel 17, maar dan wordt er ook niks ge-output.
Gewijzigd op 14/08/2012 16:47:23 door Nick Nurmodeluxe
 
Stefan WM

Stefan WM

14/08/2012 16:45:06
Quote Anchor link
en automatisch 17 dan ook niet;)
 
Nick Nurmodeluxe

Nick Nurmodeluxe

14/08/2012 16:46:42
Quote Anchor link
Over die data, dat klopt het komt andersom. Ik heb dat script hiervandaan:
http://stackoverflow.com/questions/4946292/how-to-cast-the-hexadecimal-to-varchardatetime
Maar ik heb nog steeds geen oplossing.
Gewijzigd op 14/08/2012 16:56:51 door Nick Nurmodeluxe
 
Erwin H

Erwin H

14/08/2012 17:04:00
Quote Anchor link
Probeer dan eens 1-voor-1 de delen van de query en misschien eerst in de command line tool of phpmyadmin. Werkt sneller en je kan per deel zien of het werkt of niet.
 
Nick Nurmodeluxe

Nick Nurmodeluxe

14/08/2012 17:14:44
Quote Anchor link
SELECT
CAST(
'1900-01-01 00:00:00' +
INTERVAL CAST(CONV(substr(HEX(BinaryData),1,8), 16, 10) AS SIGNED) DAY +
INTERVAL CAST(CONV(substr(HEX(BinaryData),9,8), 16, 10) AS SIGNED)* 10000/3 MICROSECOND
AS DATETIME) AS converted_datetime
FROM
(
SELECT 0x0000987C00000000 AS BinaryData
) d

Dit bovenstaande werkt in phpmyadmin. Dus het zal in de uitvoer moeten zitten denk ik zo, maar waar?
 
Erwin H

Erwin H

14/08/2012 17:15:17
Quote Anchor link
Omdat ik het ook wel grappig vind heb ik het zelf ook even geprobeerd. Het probleem zit in het dag gedeelte. Als je de HEX conversie erop los laat en dan het aantal dagen ophaalt komt daar 813183024 uit. Dat staat gelijk aan (bij benadering) 2227898 jaar. Dat pas helaas niet meer in een datetime.....

Ergens klopt je formule, of je input dus niet.

whoops, moet ik wel de dag deel nemen en niet de tijd. Alleen dan krijg ik 808466754 wat dan weer ongeveer 6000 jaar is. Ook dat is enigzins veel.
Gewijzigd op 14/08/2012 17:26:12 door Erwin H
 
Nick Nurmodeluxe

Nick Nurmodeluxe

14/08/2012 17:26:29
Quote Anchor link
Het klopt niet wat je zegt, want het is gelukt. Er komt 2006-11-17 00:00:00 bij 0x0000987C00000000 uit! Hieronder de code;
Ik heb ipv mysql_fetch_object mysql_fetch_array gebruikt, omdat ik dan geen veldnaam hoef te gebruiken!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
mysql_connect ("mysql4.mijnhostingpartner.nl","Cornelishsg", "Beheerhsg1");
mysql_select_db ("Cornelishsghilversum");    
$string = "0x00009BA100000000";
$query = mysql_query("SELECT
CAST(
 '1900-01-01 00:00:00' +
INTERVAL CAST(CONV(substr(HEX(BinaryData),1,8), 16, 10) AS SIGNED) DAY +
 INTERVAL CAST(CONV(substr(HEX(BinaryData),9,8), 16, 10) AS SIGNED)* 10000/3 MICROSECOND
 AS DATETIME) AS converted_datetime
 FROM
 (
 SELECT "
.$string." AS BinaryData
 ) d"
);
  while ($obj = mysql_fetch_array($query)) {  
    echo $obj[0];
  }

  
  
 ?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/08/2012 17:41:13
Quote Anchor link
Een beetje muggezifterij maar dan had je nog beter mysql_fetch_row kunnen gebruiken ;-)
 
Erwin H

Erwin H

14/08/2012 17:43:58
Quote Anchor link
Nick Nurmodeluxe op 14/08/2012 17:26:29:
Het klopt niet wat je zegt, want het is gelukt.

Haha, het klopt wel wat ik zeg :-) En jouw nieuwste code klopt ook. Kan jij zelf ook zien wat je hebt veranderd waardoor het nu wel werkt en eerst niet? En wat ik dus ook verkeerd deed waardoor ik die gigantische waarde kreeg....
Gewijzigd op 14/08/2012 17:44:43 door Erwin H
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/08/2012 18:25:10
Quote Anchor link
Nick,

Haal even je inloggegevens voor de db weg uit je code.
Begrijp ik het goed dat je gegevens in mysql hebt geimporteerd uit een SQL Server export?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.