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

dans un extrait que je traite, j'ai 2 datetime colonnes. Une colonne enregistre les dates et une autre les heures comme indiqué.

Comment puis-je interroger la table pour combiner ces deux champs en une 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

Times

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000
166
demandé sur ErikE 2009-03-31 12:46:19

13 réponses

, Vous pouvez simplement ajouter les deux.

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

les ajouter renvoie le bon résultat.

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 "151910920"01 0000 + "151910920"00 0001 = "151910920"01 0001

modifier concernant les nouveaux types de Serveur SQL 2008

Date et Time sont des types introduit dans le SQL Server 2008 . Si vous insistez pour ajouter, 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)

regarder Comment combiner la date et l'heure de datetime2 dans SQL Server? pour prévenir la perte de précision en utilisant SQL Server 2008 et plus.

220
répondu Lieven Keersmaekers 2017-04-13 12:42:36

si l'élément temps de votre colonne date et l'élément date de votre colonne temps sont tous les deux zéro, alors Lieven's answer est ce dont vous avez besoin. Si vous ne pouvez pas garantir que ce sera toujours le cas, alors il devient un peu plus compliqué:

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
121
répondu LukeH 2017-05-23 12:02:53

il s'agit d'une solution alternative sans aucune conversion de char:

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

vous obtiendrez seulement une précision de millisecondes de cette façon, mais ce serait normalement OK. J'ai testé cela dans SQL Server 2008.

20
répondu Jojje 2011-11-30 16:04:48

cela a fonctionné pour moi

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

(sur SQL 2008 R2)

11
répondu biso 2013-02-14 15:51:02

si vous n'utilisez pas SQL Server 2008 (c'est-à-dire que vous n'avez qu'un type de données DateTime), vous pouvez utiliser les TSQL suivants (Bien sûr rugueux et prêt) pour obtenir 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 dur et prêt, mais ça marche!

9
répondu CraigTP 2009-03-31 08:59:12
  1. si vos deux champs sont datetime alors il suffit de les ajouter.

    par exemple:

    Declare @d datetime, @t datetime
    set @d = '2009-03-12 00:00:00.000';
    set @t = '1899-12-30 12:30:00.000';
    select @d + @t
    
  2. si vous avez utilisé Date & Time datatype puis tout simplement mouler le temps à datetime

    par exemple:

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)
    
7
répondu Pramod Pallath Vasudevan 2010-04-28 03:23:54

convertissez la première date stockée dans un champ datetime en chaîne, puis convertissez le temps stocké dans un champ datetime en chaîne, ajoutez les deux et convertissez de nouveau à un champ datetime tous en utilisant des formats de conversion connus.

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 
2
répondu SPE109 2010-04-28 03:24:08
DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);

INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');

INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');

WITH Dates (ID, [Date])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
    JOIN Times ON Times.ID = Dates.ID

Imprime:

2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30:00.000
1
répondu Konstantin Tarkus 2009-03-31 09:07:18

j'ai eu beaucoup d'erreurs comme indiqué ci-dessus donc je l'ai fait comme ceci

try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime

ça a marché pour moi.

1
répondu Tom 2017-08-30 14:52:21

Convertissez les deux champs en DATETIME:

SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)

et si vous utilisez Getdate() utilisez cette première:

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)
1
répondu Alex Briones 2017-08-30 14:53:22
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

fonctionne comme un charme

1
répondu Kristian Radolovic 2017-08-30 14:53:37

pour combiner la date à partir d'une colonne datetime et le temps à partir d'une autre colonne datetime il s'agit de la solution la plus rapide pour vous:

select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable
-1
répondu Wael Galal El Deen 2017-02-09 09:24:43

SELECT CAST (CAST (@DateField As Date) As DateTime) + CAST (cast (@Timeield As Time) As DateTime)

-1
répondu Shah 2017-12-19 08:14:57