DATETIME SQL SERVER AU SECOURS !!!!!!

Signaler
Messages postés
25
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
2 février 2006
-
Messages postés
1765
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
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 !!!!!

3 réponses

Messages postés
1765
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
6
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 :

Exemple Résultat arrondi
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995,
01/01/98 23:59:59.996,
01/01/98 23:59:59.997, ou
01/01/98 23:59:59.998 1998-01-01 23:59:59.997
01/01/98 23:59:59.992,
01/01/98 23:59:59.993,
01/01/98 23:59:59.994 1998-01-01 23:59:59.993
01/01/98 23:59:59.990 ou
01/01/98 23:59:59.991 1998-01-01 23:59:59.990

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)

Romelard Fabrice (Alias F___)
Messages postés
25
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
2 février 2006
1
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

Au secours %-6
Messages postés
1765
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
6
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
----

Romelard Fabrice (Alias F___)