Вопрос по sql-server, sql – Как преобразовать дату и время только в дату (со временем, установленным на 00: 00: 00.000)

11

У меня есть строка «2009-06-24 09: 52: 43.000», которую нужно вставить в столбец DateTime таблицы.

Но я не забочусь о времени, просто хочу вставить его как 2009-06-24 00: 00: 00.000

Как я могу сделать это в T-SQL?

Ваш Ответ

11   ответов
13

CONVERT(varchar(8), @ParamDate, 112)    -- Supported way

CAST(FLOOR(CAST(@ParamDate AS float)) AS DATETIME)   -- Unsupported way

Для SQL Server 2008 и выше:

CAST(@ParamDate AS DATE)
Я все время использую «неподдерживаемый способ». Что за магическое число 112 в первой строке? Jeffrey
Это спецификатор формата для даты. Видеть Msdn.microsoft.com / EN-US / библиотека / ms187928.aspx David McEwing
Правильный. И обратите внимание, что только 112 является правильным, потому что это формат ISO (в отличие от форматов, зависящих от локали). GSerg
DBAndrew: Поддерживаемый способ не мой, а Microsoft. Я не стал беспокоиться о явном преобразовании, поскольку Saobi хотел вставить результат в столбец datetime, и в этом случае varchar (8) будет неявно (и, что самое главное, правильно) преобразовано в datetime. Неподдерживаемый способ также не мой, это своего рода "хорошо известный", основываясь на спецификациях формата хранения даты и времени. Несмотря на количество используемых функций, это намного быстрее, поскольку не требует разбора строк. GSerg
Почему varchar (8) используется для преобразования? Saobi
10
declare @originalDate datetime
select @originalDate = '2009-06-24 09:52:43.000'

declare @withoutTime datetime
select @withoutTime = dateadd(d, datediff(d, 0, @originalDate), 0)

select @withoutTime
Это классное и элегантное решение ... но оно работает, только если входное значение фактически является датой-временем. Если вы начнете со строки (varchar), вам придется сначала преобразовать ее в дату и время, и сделать это со 100% точностью - одна из самых больших головных болей в программировании. Philip Kelley
2

я не уверен, может ли это повлиять на производительность.getdate() - это временная метка ввода в моем запросе.

select cast(cast(getdate() as DATE) as DATETIME)

6
SELECT CAST(CONVERT(VARCHAR,GETDATE(),102) AS DATETIME)

SELECT CAST(CONVERT(VARCHAR(10),'2009-06-24 09:52:43.000',102) AS DATETIME)
Это сработало. Благодарность.... METALHEAD
2

и формат всегда будет таким, как вы говорите, тогда вы сохраните его простым и эффективным. ИспользуйтеLEFT( @StrDate, 10) а такжеCONVERT это к твоему значению даты / времени. Выполнено

Если ваша строка ввода может бытьлюбо допустимый формат даты / времени, тогда вы должны использоватьCONVERT(datetime, @StrDate) первый. После этого вы идете с тем, что только что сказал Бинг, чтобы убрать часть времени.

+ 1 за чтение не только названия Heeh Andomar
1

а затем вы можете использовать CONVERT, чтобы получить только дату.

INSERT MyTable(Column1)
SELECT CONVERT(CHAR(8), CAST('2009-06-24 09:52:43.000' AS DATETIME), 112)
Ребята, почему вы все используете формат 101? Это зависит от локали, это нормально только в локали EN-US. Под EN-GB это уже не так, как в Великобритании, это дд / мм / гггг, а не мм / дд / гггг. Используйте 112, это ни от чего не зависит. GSerg
Я согласен, не используйте 101, используйте 112 или ISO ANSI. DBAndrew
Я согласен - я обычно использую 112 для разработки, но 101 обычно выглядит более читабельным в выводе при запуске примера кода. Scott Ivey
обновленный ответ, чтобы использовать дату ISO, чтобы сделать ее более дружелюбной за пределами США. Scott Ivey
0

более чистый и более портативный способ сделать это, но моя летняя идиома:

insert into tbl (date_column)
select convert(varchar, convert (datetime, '2009-06-24 09:52:43.000'), 101)
0

т. Е. Гггг-ММ-ДД, вы можете получить первые 10 символов, если значение, и вставить то, что является эквивлантом времени 00: 00: 00.0000 для этой даты.

select left('2009-12-32 4:32:00',10)

Это очень эффективный способ сделать это, поскольку он не требует преобразования типов данных ОДНАКО, он требует, чтобы дата всегда форматировалась с четырехзначным годом и двухзначным днем и месяцем.

0

Преобразуйте вашу строку в дату и время, а затем снова используйте необязательный параметр "style" дляconvert чтобы преобразовать дату и время в строку, используя только часть датыusesubstring чтобы отрубить конец вокруг даты и времени, используяfloor
0

что приведение в качестве даты, а затем даты и времени будет очень эффективным и интуитивно понятным.

 SELECT CAST(CAST(GETDATE() as date) as datetime)
-2

select cast(left(yourstring, 10) as datetime)
Это зависит от форматирования времени в первом формате даты. Вы не можете предполагать, что это верно для всех строковых форматов даты и времени. Wayne Arthurton

Похожие вопросы