cs_MACHOMAN
Messages postés25Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention 2 février 2006
-
29 déc. 2004 à 11:27
cs_fabrice69
Messages postés1765Date d'inscriptionjeudi 12 octobre 2000StatutMembreDernière intervention11 décembre 2013
-
30 déc. 2004 à 10:16
bonjour, j'ai plusieurs pb avec les datetime sous sql server :
1 - j'ai deux champs datetime, dans le premier il y a une date dans le second une heure, quand je veux les concatener dans un autre champ avec un '+' (champDate + champHeure), il me soustrait deux jours !!!
ex :
champDate champHeure concat
12/04/2004 15:14:00 10/12/2004 15:14:00 !!!
2 - Quand je veux faire l'inverse, c'est à dire séparer ma date et mon heure de mon champ concatené j'utilise
CONVERT(SMALLDATETIME, champDateSmall,103)
ici je veux dans mon champDateSmall que la date, bah non il me sort tout ! (mon champDateSmall est bien déclaré en SMALLDATETIME) !!
AU SECOURS PLEASEEEEEEEEEEE !!!!!
A voir également:
Sql convertir texte en nombre
Sql transformer texte en nombre - Meilleures réponses
cs_fabrice69
Messages postés1765Date d'inscriptionjeudi 12 octobre 2000StatutMembreDernière intervention11 décembre 20135 29 déc. 2004 à 21:55
Pour la première question, Il faut utiliser le cast ou convert vers du varchar
Par exemple :
SELECT CAST(champDate AS Varchar(10)) + CAST(champHeure AS Varchar(10))
J'ai pris 10 en taille, mais il faut l'adapter à ton cas
Pour la seconde question, Cela vient du type lui même SmallDateTime, voila une copie de l'aide MSDN sur ce type :
----------------------------------
datetime et smalldatetime
Types de données de date et d'heure permettant de représenter la date et l'heure de la journée.
datetime
Données de date et d'heure comprises entre le 1er janvier 1753 et le 31 décembre 9999, avec une précision d'un trois centième de seconde (soit 3,33 millisecondes ou 0.00333 secondes). Les valeurs sont arrondies à des incréments de .000, .003 ou .007 secondes, comme cela est illustré dans le tableau suivant :
Microsoft® SQL Server? rejette toutes les valeurs qu'il ne peut identifier comme date comprise entre 1753 et 9999.
smalldatetime
Données de date et d'heure comprises entre le 1er janvier 1900 et le 6 juin 2079, avec une précision d'une minute. Les valeurs de secondes utilisée avec smalldatetime inférieures ou égales à 29,998 sont arrondies à la minute inférieure ; les valeurs supérieures ou égales à 29,999 sont arrondies à la minute supérieure.
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
Notes
Microsoft SQL Server stocke de manière interne les valeurs de type datetime sous la forme de deux entiers de 4 octets. Les 4 premiers octets contiennent le nombre de jours écoulés avant ou après la date de base (base date) du 1er janvier 1900, qui sert de référence au système. Les valeurs datetime représentant des dates antérieures au 1er janvier 1753 ne sont pas autorisées. Les 4 autres octets stockent l'heure du jour représentée par le nombre de millièmes de seconde après minuit.
Le type de donnée smalldatetime stocke les dates et les heures du jour avec une précision inférieure à celle du type datetime. SQL Server stocke les valeurs smalldatetime sous la forme de deux entiers de 2 octets. Les deux premiers octets contiennent le nombre de jours après le premier janvier 1900. Les deux autres octets stockent le nombre de minutes écoulées après minuit. Ce type de données permet de stocker les dates comprises entre le 1er janvier 1900 et le 6 juin 2079, avec une précision d'une minute.
-------
Ainsi un type smalldatetime contient aussi les seconde comme le datetime mormal. Voila d'ailleurs la différence entre ces 2 type de données :
-----
datetime et smalldatetime
datetime
Données de date et d'heure comprises entre le 1er janvier 1753 et le 31 décembre 9999, avec une précision de trois centièmes de seconde ou de 3,33 millisecondes.
smalldatetime
Données de date et d'heure comprise entre le 1er janvier 1900 et le 6 juin 2079, avec une précision d'une minute.
-----
Si tu ne veux que la date elle même il faut bien choisir le format de sorti pour n'avoir que la date, pour l'afficher en 103 il faut convertir en nvarchar pas en smalldatetime car c'est déja un smalldatetime.
Donc pour la seconde question la réponse est a mon sens :
CONVERT(NVARCHAR(10), champDateSmall,103)
cs_MACHOMAN
Messages postés25Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention 2 février 20061 30 déc. 2004 à 09:17
j'ai un autre pb,
j'ai un champ varchar dans lequel j'ai une date avec ce format :
14/12/2004 15:34:00
Je veux séparer la date (14/12/2004) dans un champ datetime et l'heure (15:34:00) dans un autre champ datetime.
Pour la date j'y arrive, je fais :
ChampDate = SUBSTRING (CAST(ChampVarChar AS varchar(50)),1,11)
Et j'ai bien dans mon champDate 14/12/2004
Pour mon champTime c'est une autre histoire !
quoi que je fasse, un substring, cast, convert.... j'ai toujours
14/12/2004 15:34:00 ou
1/1/1900 15:34:00
J'ai essayé ta solution CONVERT(NVARCHAR(10), champDateSmall,109), mais ca ne marche pas, pourtant le CONVERT est bien sensé convertir des chaines en date ou heure ! enfin je crois
http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0901/fr/html/dbrffr9/00000145.htm CONVERT ( type de données, expression [ , style_format ] )
style_format L'argument style_format est un numéro de code de style qui décrit le format de date à utiliser pour convertir des chaînes en dates ou en heures et vice versa. Les valeurs de l'argument style_format ont les significations suivantes
cs_fabrice69
Messages postés1765Date d'inscriptionjeudi 12 octobre 2000StatutMembreDernière intervention11 décembre 20135 30 déc. 2004 à 10:16
Dans ce cas, il faut utiliser les fonctions internes pour cette demande :
- DAY
- MONTH
- YEAR
Voila d'ailleurs toutes les fonctions SQL pour les manipulations de Date :
----
Fonction Propriété de déterminisme
DATEADD Déterministe
DATEDIFF Déterministe
DATENAME Non déterministe
DATEPART Cette fonction est déterministe, sauf si elle est utilisée en tant que DATEPART (dw, date). Le paramètre dw, élément de date weekday, dépend de la valeur configurée par SET DATEFIRST, qui définit le premier jour de la semaine.
DAY Déterministe
GETDATE Non déterministe
GETUTCDATE Non déterministe
MONTH Déterministe
YEAR Déterministe
-----
Pour l'heure, je pense qu'il faut proceder autrement, via le convert et le N° 108 :
CONVERT (VARCHAR(8), TonChampDateHeure, 108)
Voila d'ailleurs la liste des formats possible pour les données datetime :
Sachant que la différence entre la série 1... 9 et 101 ... 109 est que le 10x rend l'année avec le siecle.
-----
Sans siècle (yy) Avec siècle (yyyy)
Standard
Entrée/Sortie**
- 0 ou 100 (*) Par défaut mon dd yyyy hh:miAM (or PM)
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 Anglais/Français dd/mm/yy
4 104 Allemand dd.mm.yy
5 105 Italien dd-mm-yy
6 106 - dd mon yy
7 107 - Mon dd, yy
8 108 - hh:mm:ss
- 9 ou 109 (*) Valeur par défaut + millièmes de secondes mon dd yyyy hh:mi:ss:mmmAM (or PM)
10 110 USA mm-dd-yy
11 111 Japon yy/mm/dd
12 112 ISO yymmdd
- 13 ou 113 (*) Valeur par défaut Europe + millièmes de secondes dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 ou 120 (*) ODBC canonique yyyy-mm-dd hh:mi:ss(24h)
- 21 ou 121 (*) ODBC canonique (avec millièmes de secondes) yyyy-mm-dd hh:mi:ss.mmm(24h)
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(no spaces)
- 130* Kuwaiti dd mon yyyy hh:mi:ss:mmmAM
- 131* Kuwaiti dd/mm/yy hh:mi:ss:mmmAM
----