Как выбрать дату без времени в SQL


257

Когда я выбираю дату в SQL, она возвращается как 2011-02-25 21:17:33.933. Но мне нужна только часть даты, то есть 2011-02-25. Как я могу это сделать?


4
Я предполагаю, что он хочет строку, и поэтому она не дублируется
bernd_k


@TylerH есть ли способ получить 2011-02-25 00: 00: 00.000 вместо текущего времени?
Thrainder

Ответы:


148

Я предполагаю, что он хочет строку.

select convert(varchar(10), '2011-02-25 21:17:33.933', 120)

120 здесь говорит функцию преобразования , что мы перейдем дату ввода в следующем формате : yyyy-mm-dd hh:mi:ss.


Для чего 120?
Павле

@ Павле см. Эту статью Стили даты и времени
Fox Vĩnh Tâm

я использовал этот select convert (varchar (10), APPROVED_DATE, 120), я получил столбец с ошибкой APPROVED_DATE datetime, как я буду конвертировать его? Ошибка Не удалось связать многоэлементный идентификатор «LAB_RESULTS.APPROVED_DATE».
Абдулла

531

Для SQL Server 2008:

Convert(date, getdate())  

Пожалуйста, обратитесь к https://docs.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql


6
Я получаю «Тип даты не является определенным типом системы».
SeaDrive

10
DATEновый в 2008 году.
Тим Шмельтер

33
Я понятия не имею, почему это такой голос против. этот вопрос относится к SQL Server 2005, а не к 2008 году. 2005 не имеет dateтипа данных, поэтому это решение считается недействительным.
Джошуа Бернс

84
За это проголосовали, потому что люди ищут решения своей проблемы, а не авторов. Так что, если 110 человек нашли, что это сработало для них, я думаю, это справедливо, что у них 110 голосов.
Джеймс

У меня та же ошибка, когда я использую select convert (table.order_date, getdate ()); SQL Server версии 2017, ошибка (тип даты не является определенным типом системы) тип столбца datetime
Абдулла

57

Самый быстрый datediff, например,

select dateadd(d, datediff(d,0, [datecolumn]), 0), other..
from tbl

Но если вам нужно использовать только значение, вы можете пропустить дату, например,

select ...
WHERE somedate <= datediff(d, 0, getdate())

где выражения datediff(d, 0, getdate())достаточно, чтобы вернуть сегодняшнюю дату без временной части.


Олди, но хорошо, использовал этот трюк десятки раз в более старых БД 2000/2005.
KeithS

43

Использовать CAST (GETDATE () в качестве даты), который работал для меня, просто.


где я добавлю имя моего столбца? выбрать приведение (getdate () в качестве даты, order_date)?
Абдулла

@AbdullahCAST(order_date AS DATE)
Эндрю Мортон


12

вы можете использовать как это

SELECT Convert(varchar(10), GETDATE(),120) 

куда я положу дату заказа имени моего столбца?
Абдулла

10

Для более старой версии 2008 :

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)


аплодисменты за это! Другие решения опираются только на часть varchar (10), которая просто усекает значение.
Гонза Овьедо

2

Немного поздно, но используйте функцию ODBC "curdate" (угловые скобки 'fn' - escape-последовательность функции ODBC).

SELECT {fn curdate()} 

Вывод: 2013-02-01


4
Мне честно любопытно, как вы думаете, ваш ответ лучше, чем принятый ответ. Или где вы, возможно, ссылаетесь на другие ответы?
Микаэль Эрикссон

1
@Mikael Eriksson: Хм, потому что ODBC-функции являются каноническими функциями и поэтому индексируются, в отличие от недетерминированных функций SQL-сервера. Но не берите в голову, это проблема масштабирования, когда вы переходите от 3-х записей в тестировании к 1 * 10E6 в производстве, у вас не возникает проблем во время разработки;)
Stefan Steiger

8
Если вы запустите этот запрос SELECT {fn curdate()} FROM (SELECT 1) AS T(X)и посмотрите на фактический план выполнения (версия xml), вы увидите, что на самом деле выполняется CONVERT(varchar(10),getdate(),23). Таким образом, тип данных этой функции ODBC varchar(10)означает, что если вы хотите сравнить результат с a, datetimeвы получите неявное преобразование из varchar(10)в datetimeстроку yyyy-mm-dd. Это неявное преобразование не удастся set dateformat dmy.
Микаэль Эрикссон

1
@Mikael Eriksson: похоже на ошибку, они должны использовать вместо этого SELECT CONVERT (char (8), GETDATE (), 112).
Стефан Штайгер

«Канонические функции и, следовательно, индексируемые, в отличие от недетерминированных функций SQL-сервера» - ну что?
Мартин Смит,


2

Преобразуйте его обратно в datetime после преобразования в date, чтобы сохранить то же время данных, если это необходимо

select Convert(datetime, Convert(date, getdate())  )


1

Использовать просто:

convert(date, Btch_Time)

Пример ниже:

Стол:

Efft_d       Loan_I  Loan_Purp_Type_C   Orig_LTV    Curr_LTV    Schd_LTV    Un_drwn_Bal_a      Btch_Time            Strm_I  Btch_Ins_I
2014-05-31  200312500   HL03             NULL         1.0000    1.0000         1.0000      2014-06-17 11:10:57.330  1005    24851e0a-53983699-14b4-69109


Select * from helios.dbo.CBA_SRD_Loan where Loan_I in ('200312500') and convert(date, Btch_Time) = '2014-06-17'

1

Уже слишком поздно, но у меня хорошо получилось.

declare @vCurrentDate date=getutcdate()

select @vCurrentDate

Когда тип данных - дата, часы будут усечены


0

В PLSQL вы можете использовать

to_char(SYSDATE,'dd/mm/yyyy')

рассмотреть возможность передачи этого в комментарий.
xlembouras

Этот вопрос касается SQL Server ... не Oracle
Бен

0

Сначала преобразуйте дату в число с плавающей точкой (отображающее числовое значение), затем ROUNDчисловое значение в 0 десятичных знаков, а затем преобразуйте его в дату и время.

convert(datetime,round(convert(float,orderdate,101),0) ,101)

0

Если вы хотите вернуть тип даты, просто используйте дату

CONVERT(date, SYSDATETIME())

или

SELECT CONVERT(date,SYSDATETIME()) 

или

DECLARE @DateOnly Datetime
SET @DateOnly=CONVERT(date,SYSDATETIME())

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.