SELECT GETDATE()
Повернення: 2008-09-22 15:24:13.790
Я хочу, щоб частина дати без часової частини: 2008-09-22 00:00:00.000
Як я можу це отримати?
SELECT GETDATE()
Повернення: 2008-09-22 15:24:13.790
Я хочу, щоб частина дати без часової частини: 2008-09-22 00:00:00.000
Як я можу це отримати?
Відповіді:
На 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
Плюси:
varchar
<-> datetime
конверсіїlocale
За пропозицією Майкла
Використовуйте цей варіант: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
select getdate()
SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))
SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))
Вихід:
2019-04-19 08:09:35.557
2019-04-19 08:00:00.000
4763-02-17 00:00:00.000
2019-04-19 00:00:00.000
2019-04-19 00:00:00.000
2019-04-01 00:00:00.000
1903-12-03 00:00:00.000
2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
datetime
даних взагалі не може мати часу . Думаю, ви плутаєте сховище даних із презентацією користувача. Якщо все, що вам потрібно, це спосіб показати користувачеві рядок, яка не має часової частини (не нулі, просто пробіли), то ви просто хочете Convert(varchar(30), @Date, 101)
або щось подібне. Див. Розділ Книги SQL Server Online • Передача та перетворення для отримання додаткової інформації.
CAST(... AS DATE)
або CONVERT(DATE, ...)
, що досить часто згадується на цій самій сторінці.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
оскільки тоді dd
її можна замінити на будь-яке інше datepart
ключове слово, щоб обрізати ваше datetime
на довільному рівні.
Тепер у SQLServer 2008 є тип даних "дата", який містить лише дату без компонента часу. Усі, хто використовує SQLServer 2008 та новіші версії, можуть зробити наступне:
SELECT CONVERT(date, GETDATE())
Якщо використовується SQL 2008 і вище:
select cast(getdate() as date)
DateTime2
замість цього, і це працює чудово. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
, через DateTime
обмеження. Спробуйте без жодної ролі Date
, вона також дає результат 2015-10-01
! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=>2015-10-01
DATEADD і DATEDIFF кращі, ніж ПОВЕРНЕННЯ варчару. Обидва запити мають однаковий план виконання, але плани виконання стосуються насамперед стратегій доступу до даних і не завжди виявляють неявні витрати, пов'язані з процесорним часом, необхідним для виконання всіх фрагментів. Якщо обидва запити проводяться проти таблиці з мільйонами рядків, час процесора за допомогою DateDiff може бути близьким до 1/3 часу конвертувати процесор!
Щоб побачити плани виконання запитів:
set showplan_text on
GO
І DATEADD, і DATEDIFF виконають CONVERT_IMPLICIT.
Хоча рішення CONVERT простіше і легше читати для деяких, це є більш повільним. Не потрібно повертатися до дати часу (це неявно робиться сервером). Також немає реальної потреби в методі DateDiff для DateAdd після цього, оскільки цілий результат також буде неявно перетворений назад у поточний час.
ВИБІР КОНВЕРТ (varchar, MyDate, 101) ВІД DATETable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
ВИБІР DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) З дат
|--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 на плаваючий і назад не завжди дає початкове значення.
Пам’ятайте хлопці: нікому не вірте. Подивіться статистику результативності та протестуйте самі!
Будьте уважні, коли ви тестуєте свої результати. Вибір клієнтів багатьох рядків приховає різницю в продуктивності, оскільки для відправлення рядків по мережі потрібно більше часу, ніж це для виконання обчислень. Тому переконайтесь, що роботу всіх рядків виконує сервер, але набір рядків не надсилається клієнту.
Деякі люди, мабуть, мають плутанину щодо того, коли оптимізація кешу впливає на запити. Запуск двох запитів в одній партії або в окремих партіях не впливає на кешування. Таким чином, ви можете або закінчити кеш вручну, або просто запустити запити вперед і назад кілька разів. Будь-яка оптимізація для запиту №2 також вплине на будь-які наступні запити, тому викиньте виконання №1, якщо хочете.
Ось повний тестовий скрипт та результати роботи, які доводять, що DateDiff значно швидше, ніж перетворення на varchar.
Спробуйте це:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Вищенаведене твердження перетворює ваш поточний формат у YYYY/MM/DD
, перейдіть за цим посиланням, щоб вибрати бажаний формат.
mm/dd/yyyy
формат.
Для повернення у форматі дати
CAST (дата замовлення AS AS)
Вищевказаний код буде працювати на сервері sql 2010
Він повернеться як 12.12.2013
Для SQL Server 2012 використовуйте наведений нижче код
CONVERT(VARCHAR(10), OrderDate , 111)
Ви можете використовувати CONVERT
функцію для повернення лише дати. Дивіться посилання нижче:
Маніпуляція з датою та часом у SQL Server 2000
Синтаксис використання функції перетворення:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Якщо результат потрібен як результат varchar
, вам слід пройти
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
про що вже говорилося вище.
Якщо вам потрібен результат у форматі дати та часу, слід скористатися будь-яким із запитів, наведених нижче
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00: 00: 00.000
Використання FLOOR () - просто скоротити частину часу.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Використовуйте Format()
функцію.
Для SQL-сервера вже існує безліч відповідей та типів форматування. Але більшість методів є дещо неоднозначними, і вам буде важко запам’ятати цифри для типу або функцій формату щодо конкретного формату дати. Ось чому в наступних версіях SQL-сервера є кращий варіант.
FORMAT ( value, format [, culture ] )
Варіант культури дуже корисний, оскільки ви можете вказати дату відповідно до своїх глядачів.
Ви повинні пам'ятати d (для невеликих візерунків) і 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)
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日
Якщо вам потрібно більше форматів, ви можете перейти до:
ЯКЩО ви хочете використовувати CONVERT і отримати той самий вихід, як у вихідному запитанні, тобто yyyy-mm-dd, тоді використовується CONVERT(varchar(10),[SourceDate as dateTime],121)
той же код, що і відповіді попередньої пари, але код для перетворення у yyyy-mm-dd з тире є 121.
Якщо я можу потрапити на свою мильну скриньку на секунду, подібне форматування не належить до рівня даних , і тому це не було можливим без дурних "хитрощів" до SQL Server 2008, коли фактичні типи даних введено. Здійснення таких перетворень у рівні даних - це велика витрата накладних витрат на ваші СУБД, але, що ще важливіше, друге, якщо ви робите щось подібне, ви в основному створили в пам'яті осиротілі дані, які я припускаю, що потім повернетеся до програми. Ви не можете повернути його в інший стовпець 3NF + або порівнювати його з будь-яким типом, що не було введено без ревертування, тому все, що ви зробили, це вводити точки відмови та видаляти реляційну посилання.
ЗАВЖДИ Ви завжди повинні повернути тип даних dateTime в програму виклику та в рівні ПРЕДСТАВЛЕННЯ, внести всі необхідні коригування. Як тільки ви переходите до перетворення речей, перш ніж повернути їх абоненту, ви видаляєте з програми всі сподівання на референтну цілісність. Це повторно запобігає операції UPDATE або DELETE, якщо ви не зробите якусь ручну реверсію, яка знову піддає вашим даним помилку людини / code / gremlin, коли немає потреби.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- абсолютно немає причин знімати час з колонки.
@Date
має нульову часову частину. У випадку, якщо це неправда, ви все ще повинні знати, як усікати час на стороні сервера. Я погоджуюся з цією відповіддю, що форматування слід залишити на шарі презентації, але я не погодився з тим, що залишити це для переднього кінця означає, що вам не потрібно знати швидкий спосіб усікання.
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Редагувати: Перші два способи по суті є однаковими, і виконують метод перетворення в varchar.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, тому що dd
s може бути вивантажений для будь-якого з тих datepart
ключових слів , щоб відсікти дату в будь-якому сегменті ви вибираєте. (Також зауважте, що dd
це лише абревіатура для day
.)
Для отримання зазначеного результату я використовую таку команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Я вважаю це корисним.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Якщо ви присвоюєте результати стовпцю або змінній, надайте йому тип DATE, а перетворення неявне.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Я думаю, що це спрацює у вашому випадку:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Гаразд, хоча я трохи запізнююся :), ось інше рішення.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
Результат
2008-09-22 00:00:00.000
І якщо ви використовуєте SQL Server 2012 та новіші версії, ви можете використовувати FORMAT()
таку функцію -
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Навіть використовуючи давній MSSQL Server 7.0, код тут (люб’язно за цим посиланням ) дозволив мені отримати будь-який формат дати, який я шукав у той час:
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
Дата:
ВИБІР КОНВЕРТ (дата, GETDATE ()) ВИБІРТЕ КАСТ (GETDATE () як дата)
Час:
ВИБІР КОНВЕРТ (час, GETDATE (), 114) ВИБІРТЕ КАСТ (GETDATE () як час)
Просто ви можете зробити так:
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
чому ви не використовуєте DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?
EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
ви можете змінити послідовність m, d та року, переставивши '%d-%m-%Y'
частину
Я знаю, що це по-старому, але я не бачу, де хто так це заявив. З того, що я можу сказати, це стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Було б добре, якби Microsoft також міг підтримати стандартну змінну CURRENT_DATE ANSI.
select {fn current_date()} as today
працює для мене.
Я віддаю перевагу такому, про яке не згадувалося:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Це також не хвилює локальне або подвійне перетворення - хоча кожен "datepart", ймовірно, має математику. Тож це може бути трохи повільніше, ніж метод датифікування, але мені це набагато зрозуміліше. Особливо, коли я хочу групуватися лише за роком та місяцем (встановити день у 1).
У цьому випадку, лише за датою, ми запустимо цей запит:
Ви можете використовувати наступне для частини дати та форматування дати:
DATENAME => Повертає символьний рядок, який представляє вказану частину дати зазначеної дати
DATEADD => DATEPART()
Функція використовується для повернення однієї частини дати / часу, наприклад року, місяця, дня, години, хвилини тощо.
DATEPART => Повертає ціле число, яке представляє вказану частину дати зазначеної дати.
CONVERT()
=> CONVERT()
Функція - це загальна функція, яка перетворює вираз одного типу даних в інший.
CONVERT()
Функція може бути використана для відображення даних дати / часу в різних форматах.