убрать - как записать дату в sql




Как вернуть только дату из типа данных SQL Server DateTime (20)

SELECT GETDATE()

Возврат: 2008-09-22 15:24:13.790

Я хочу, чтобы эта дата была частью без временной части: 2008-09-22 00:00:00.000

Как я могу это получить?


Если вы используете SQL Server 2012 или более поздние версии ,

Используйте функцию Format() .

Уже существует несколько ответов и типов форматирования для SQL-сервера. Но большинство методов несколько неоднозначны, и вам будет сложно запомнить числа для формата или функций формата в отношении формата конкретной даты. Вот почему в следующих версиях SQL-сервера есть лучший вариант.

FORMAT ( value, format [, culture ] )

Вариант Culture очень полезен, так как вы можете указать дату для своих зрителей.

Вы должны помнить d (для маленьких моделей) и D (для длинных узоров).

1. «d» - шаблон короткой даты.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. «D» - длинный шаблон даты.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

Дополнительные примеры в запросе.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

Если вы хотите больше форматов, вы можете перейти к:

  1. Стандартные строки формата даты и времени
  2. Пользовательские строки даты и времени

DATEADD и DATEDIFF лучше, чем CONVERTING для varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в первую очередь касаются стратегий доступа к данным и не всегда показывают скрытые затраты, связанные с временем процессора, затраченным на выполнение всех частей. Если оба запроса выполняются против таблицы с миллионами строк, время CPU, использующее DateDiff, может быть близким к 1/3-му числу времени преобразования процессора!

Чтобы просмотреть планы выполнения запросов:

set showplan_text on
GO 

И DATEADD, и DATEDIFF будут выполнять CONVERT_IMPLICIT.

Хотя решение CONVERT проще и проще читать для некоторых, оно медленнее. Нет необходимости отбрасывать обратно в datetime (это неявно делается сервером). Также нет необходимости в методе DateDiff для DateAdd после этого, поскольку результат целочисленного значения также будет неявно преобразован обратно в datetime.

SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

Использование FLOOR () по мере того, как предлагаемый метод @digi имеет производительность ближе к DateDiff, но не рекомендуется, поскольку приведение типа данных datetime к float и back не всегда дает исходное значение.

Помните парней: Не верьте никому. Посмотрите статистику производительности и протестируйте ее самостоятельно!

Будьте осторожны, когда вы проверяете свои результаты. Выбор многих строк для клиента скроет разницу в производительности, потому что требуется больше времени для отправки строк по сети, чем для выполнения вычислений. Поэтому убедитесь, что работа для всех строк выполняется сервером, но нет набора строк, отправленного клиенту.

Кажется, у некоторых людей есть путаница, когда оптимизация кеша влияет на запросы. Выполнение двух запросов в одной партии или в отдельных партиях не влияет на кеширование. Таким образом, вы можете либо истечь кеш вручную, либо просто запускать запросы взад и вперед несколько раз. Любая оптимизация для запроса # 2 также повлияет на любые последующие запросы, поэтому, если хотите, выкиньте выполнение №1.

Вот полный тестовый сценарий и результаты производительности, которые доказывают, что DateDiff значительно быстрее, чем преобразование в varchar.


В SQL Server 2008 и выше вы должны CONVERT на сегодняшний день:

SELECT CONVERT(date, getdate())

В более старых версиях вы можете сделать следующее:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

например

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

дает мне

2008-09-22 00:00:00.000

Плюсы:

  • Не требуется преобразование datetime < varchar > < varchar >.
  • Не нужно думать о locale

Вы можете использовать следующую для даты часть и форматирование даты:

DATENAME => Возвращает строку символа, которая представляет указанную дату части указанной даты

DATEADD => Функция DATEPART() используется для возврата одной части даты / времени, например, года, месяца, дня, часа, минуты и т. Д.

DATEPART => Возвращает целое число, которое представляет заданную дату в определенную дату.

CONVERT() => Функция CONVERT() - это общая функция, которая преобразует выражение одного типа данных в другое. Функция CONVERT() может использоваться для отображения данных даты и времени в разных форматах.


Даже используя древний MSSQL Server 7.0, код здесь (любезно предоставлен по этой link ) позволил мне получить любой формат даты, который я искал в то время:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

Он произвел этот результат:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

Дата:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

Если вы используете SQL 2008 и выше:

select cast(getdate() as date)

Если вы присваиваете результаты столбцу или переменной, укажите тип DATE, а преобразование неявно.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

Использование FLOOR () - просто сократить время.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

Попробуй это:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Вышеприведенное заявление преобразует ваш текущий формат в YYYY/MM/DD , пожалуйста, обратитесь к этой ссылке, чтобы выбрать предпочтительный формат.


Просто вы можете сделать так:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Выходы:

2008-09-22 00:00:00.000

Или просто так:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Результат:

Date Part Only
--------------
2013-07-14

Чтобы получить указанный результат, я использую следующую команду.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Я знаю, это полезно.


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

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))

Я одобряю следующее, о котором не упоминалось:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Он также не заботится о локальном или делает двойной конверт - хотя каждый «datepart», вероятно, делает математику. Так что это может быть немного медленнее, чем метод датиффа, но для меня это намного яснее. Особенно, когда я хочу сгруппировать всего год и месяц (установите день 1).


почему бы вам не использовать DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

вы можете изменить последовательность m, d и year, переустановив '%d-%m-%Y' часть


Формат возврата в формате даты

CAST (дата OrderDate AS)

Вышеприведенный код будет работать в SQL Server 2010

Он вернется как 12/12/2013

Для SQL Server 2012 используйте приведенный ниже код.

CONVERT(VARCHAR(10), OrderDate , 111)

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))






datetime