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
13 réponses
, Vous pouvez simplement ajouter les deux.
- si le
Time part
de votre colonneDate
est toujours zéro - et le
Date part
de votreTime
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.
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
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.
cela a fonctionné pour moi
CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)
(sur SQL 2008 R2)
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!
-
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
-
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)
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)
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
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.
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)
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table
fonctionne comme un charme
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
SELECT CAST (CAST (@DateField As Date) As DateTime) + CAST (cast (@Timeield As Time) As DateTime)