236 votes

Comment combiner la date à partir d'un champ avec le temps à partir d'un autre domaine - MS SQL Server

Dans un extrait que je fais, j'ai 2 datetime colonnes. Une colonne stocke les dates et l'autre à la fois, comme.

Comment puis-je interroger la table de combiner ces deux champs en 1 colonne de type datetime?

Dates

2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000

Fois

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000

283voto

Lieven Keersmaekers Points 32396

Vous pouvez simplement ajouter les deux.

  • si l' Time part de votre Date colonne est toujours à zéro
  • et l' Date part de votre Time colonne est également toujours à zéro (base date: 1 janvier 1900)

Ajouter renvoie le résultat correct.

SELECT Combined = MyDate + MyTime FROM MyTable

Justification (bravo à ErikE/dnolan)

It works like this due to the way the date is stored as two 4-byte `Integers` with the
left 4-bytes being the `date` and the right 4-bytes being the `time`.  

Its like doing $0001 0000 + $0000 0001 = $0001 0001

Edit concernant les nouveaux types SQL Server 2008

Date et Time sont des types introduit en SQL Server 2008. Si vous insistez sur l'ajout, vous pouvez utiliser Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Edit2 à propos de la perte de précision dans SQL Server 2008 et jusqu' (bravo à Martin Smith)

Jetez un oeil à la Façon de combiner la date et l'heure de datetime2 dans SQL Server? pour éviter la perte de précision à l'aide de SQL Server 2008.

143voto

LukeH Points 110965

Si le temps de l'élément de votre colonne date et l'élément date de votre temps de colonne sont tous deux à zéro, alors la Lieven de réponse est ce que vous avez besoin. Si vous ne pouvez pas garantir qu'il sera toujours le cas, alors c'est un peu plus compliqué.

Si vous utilisez SQL Server 2008, vous pouvez combiner les colonnes comme ceci:

SELECT CAST(CAST(your_date_column AS DATE) AS DATETIME) +
    CAST(your_time_column AS TIME)
FROM your_table

Pour les versions antérieures de SQL Server, puis c'est ce que vous aurez besoin de:

SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table

32voto

Jojje Points 75

C'est une solution alternative sans aucun char de conversions:

DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))

Vous n'obtiendrez que les millisecondes de l'exactitude de cette façon, mais qui serait normalement OK. J'ai testé ce dans SQL Server 2008.

16voto

biso Points 89

Cela a fonctionné pour moi

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(sur SQL 2008 R2)

10voto

CraigTP Points 18514

Si vous n'êtes pas à l'aide de SQL Server 2008 (c'est à dire vous avez seulement un type de données DateTime), vous pouvez utiliser la commande suivante (certes approximative) TSQL à réaliser ce que vous voulez:

DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime 

SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'


-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))

-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)

-- Concatenates Date and Time parts.
SELECT
CAST(
	DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
	DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)			
as datetime)

C'est rude, mais il fonctionne!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X