sql — Как получить DATE из строки без разделителей?

Есть строка такого формата 20140102125832.

Как наиболее идиоматично красиво получить тип DATE из этой строки?

Ввод: 20140102125832

Вывод: 2014-01-02 12:58:32

  • sql
  • oracle
  • datetime
with str (val) as (
    select '20140102125832' from dual),
dt (val) as (
    select cast (str.val as date, 'yyyymmddhh34miss') from str)
select to_char (dt.val, 'yyyy-mm-dd hh34:mi:ss') str, dump (dt.val, 16) dump from dt
/
STR                 DUMP                            
------------------- --------------------------------
2014-01-02 12:58:32 Typ=13 Len=8: de,7,1,2,c,3a,20,0

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

select * from nls_session_parameters where parameter='NLS_DATE_FORMAT'
/
PARAMETER                      VALUE                           
------------------------------ --------------------------------
NLS_DATE_FORMAT                YYYY-MM-DD Hh34:MI:SS           

Чтобы избежать неявного преобразования, следует в выборке, используя функцию to_char, явно преобразовать обратно в символьный вид.

на клиенте стоял другой формат даты, поэтому показывало при выборке дату без времени, можно изменить формат на клиенте навсегда или на одну сессию

select
  to_date('20140102125832', 'YYYY-MM-DD Hh34:MI:SS') as dt
from dual;

результат: 2014-01-02 12:58:32

формат поменял на одну сессию:

alter session set nls_date_format = 'YYYY-MM-DD Hh34:MI:SS';

2

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Как вывести дату без времени(21.

01.2002) а не 21.01.2002 18:00:00

 
vasilly   (2002-08-02 17:36) [0]

Как вывести дату без времени(21.01.2002) а не 21.01.2002 18:00:00

для того чтобы корректно составить условие…
проблема в том что пользователь не должен видеть время…!
кто знает?


 
Кулюкин Олег   (2002-08-02 17:46) [1]

Воспользуйтесь функцией FormatDateTime
Format = «dd.mm.yyyy»


 
[email protected]   (2002-08-02 17:47) [2]

Где надо вывести дату?

Если в Grid-e, то в нем можно задать для полей формат вывода.

Если в др.компонентах, то воспользуйся функцией FormatDateTime,
напр:
Label1. Caption:= FormatDateTime(«dd.mm.yy»,quTemp1.FieldByName(«dat»).AsDateTime))


 
vasilly   (2002-08-02 17:59) [3]

нет вывести надо в датасет… просто
как сделать в гриде я знаю… волпрос скорее по SQL…
потому что сервер MSSQL7 в частности не дает выкинуть дату без времени


 


vasilly   (2002-08-02 18:01) [4]

причем еще один момент… нельзя использовать
convert(varchar(10), RegDate,104) AS [Дата ч.]


 
vasilly   (2002-08-02 18:03) [5]

вопрос скорее по типам данных… насколько мне известно в MSSQL нет типа date, который например есть в IB. ..
нужно сделать вид который бы выкидавал урезаную дату и понимал ее как дату а не как например строку


 
[email protected]   (2002-08-02 18:23) [6]

>vasilly © (02.08.02 17:59)
>вывести надо в датасет
тогда твой вопрос должен звучать по другому:
как через SELECT выбрать чистую дату откинув время.


 
[email protected]   (2002-08-02 18:26) [7]

тогда тебе без CONVERTa не обойтись :(
или другие извраты 🙂


 
sniknik   (2002-08-02 19:48) [8]

так ты ее и сохраняй так как нужно она так и выдаватся будет
—в памяти
DECLARE @datevar datetime
SET @datevar = «12/31/98″
SELECT @datevar

—в таблицу
declare @D Datetime
set @D=»12/12/02″
INSERT INTO CASHSAIL ([DATE]) VALUES (@D)
GO
—показать
SELECT * FROM CASHSAIL
именно дата и именно без времени.
поле DATE здесь smalldatetime, в дельфих видится как ftDateTime. и работает именно так как тебе хочется.


 
Luchkin   (2002-08-05 15:56) [9]

недавно столкнулся с той-же фигнёй. Вот к чему пришёл:

SELECT
Adres,
CAST(CAST(Data AS INTEGER) AS smalldatetime) AS DATA,
Kod, Comment
FROM HISTORY

вроде работает… и не тормозит.


 
Luchkin   (2002-08-05 16:26) [10]

Ма-а-а-аленькое примечание: если полная дата со временем после полудня, то округлённая дата будет на день больше 🙁


 
sniknik   (2002-08-05 17:04) [11]

ну это то легко решить
DECLARE @DATE DATETIME
SET @DATE=GETDATE()
SELECT CAST(ROUND(CAST(@DATE AS FLOAT), 0, 1) as smalldatetime)
будет и после полудня нормально давать :-).
понимать правильно!


 
3JIA9I CyKA   (

2002-08-05 17:34) [12]

convert(datetime, substring(convert(binary(8), GetDate()), 1, 4)+0x00000000)


 
3JIA9I CyKA   (2002-08-05 17:37) [13]

Это было «получить только дату»
вывести — это так:
convert(varchar(10), GetDate(), 104)


 
Juve   (2002-08-06 00:15) [14]

Народ, ну во-первых FormatDateTime……а во вторых можно небольшой изврат: StrToDate(DateTimeToStr(Реальная дата))

— тоже работает! Может я чего не понял?


 
3JIA9I CyKA   (2002-08-06 11:06) [15]

Ответ на этот вопрос зависит от того, на какой стороне (C/S) это надо сделать.


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

спросил

Изменено 3 месяца назад

Просмотрено 889 тысяч раз

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

  • sql
  • sql-сервер
  • sql-сервер-2005

4

Для SQL Server 2008:

 Convert(date, getdate())
 

См. https://learn.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql

7

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

 выберите convert(varchar(10), '2011-02-25 21:17:33. 933', 120)
 

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

4

Использование CAST(GETDATE() As Date) сработало для меня

3

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

 выберите dateadd(d, datediff(d,0, [datecolumn]), 0), другое..
из таблицы
 

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

 выбрать ...
ГДЕ некоторая дата <= datediff(d, 0, getdate())
 

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

1

 БРОСОК(
        ПОЛ(
             CAST(GETDATE() AS FLOAT)
        )
КАК ДАТАВРЕМЯ
)
 

http://www.bennadel. com/blog/122-Getting-Only-the-Date-Part-of-a-Date-Time-Stamp-in-SQL-Server.htm

2

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

ВЫБЕРИТЕ ДАТУДОБАВИТЬ(ДЕНЬ, РАЗНИЦА ДАТЫ(ДЕНЬ, 0, ПОЛУЧИТЬДАТУ()), 0)

1

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

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

1

Если вам нужно, чтобы время было равно нулю, например, 2018-01-17 00:00:00.000 :

ВЫБРАТЬ ПРЕОБРАЗОВАТЬ(ДАТАВРЕМЯ, ПРЕОБРАЗОВАТЬ(ДАТА, ПОЛУЧИТЬДАТА()), 121)

1

Я бы использовал функцию DATEFROMPARTS. Это довольно просто, и вам не нужен кастинг. Например, этот запрос:

 Выберите DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())) as myNewDate
 

вернет

21. 01.2021

Хорошая часть, вы также можете создать свою собственную дату, например, вы хотите, чтобы первый день месяца был датой, чем вы можете просто использовать, как показано ниже:

 Выберите DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) как myNewDate
 

Результат будет:

01.01.2021

Вы тоже можете попробовать это.

 ВЫБРАТЬ ПРЕОБРАЗОВАТЬ(ДАТА, ПОЛУЧИТЬДАТА(), 120)
 

Слишком поздно, но следующее сработало для меня хорошо

 объявлять @vCurrentDate date=getutcdate()
выберите @vCurrentDate
 

Если типом данных является дата, часы будут усечены.

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

 ВЫБЕРИТЕ {fn curdate()}
 

Вывод: 01.02.2013

5

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

 выберите Convert (datetime, Convert (date, getdate ()) )
 

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

 CONVERT(date, SYSDATETIME())
 

или

 SELECT CONVERT(дата,SYSDATETIME())
 

или

 DECLARE @DateOnly Datetime
УСТАНОВИТЬ @DateOnly=CONVERT(дата,SYSDATETIME())
 

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

 конвертировать(дата, 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-14б4-69109
 
 Выберите * из helios.dbo.CBA_SRD_Loan, где Loan_I в ('200312500') и конвертируйте (дата, Btch_Time) = '2014-06-17'
 

выберите ДАТУ (поле) из таблицы;

значение поля: 2020-12-15 12:19:00

выберите значение: 2020-12-15

1

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

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

2

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

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

1

Попробуйте это.

 ВЫБЕРИТЕ ДАТУДОБАВИТЬ(ДД, 0, РАЗНИЦА ДАТЫ(ДД, 0, ПОЛУЧИТЬДАТУ()))
 

Я бы создал скалярную функцию и использовал бы format() для установки типа данных, который вы хотите видеть. Это должно быть легко в обслуживании позже.

1

Личный фаворит:

 выберите convert(datetime, convert(int, getdate()))
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

получить дату без времени на сервере sql

Sql Server, Советы/рекомендацииDATE, Дата только из DateTime, Только часть даты, Только часть даты из DateTime, DATETIME, получить дату без времени на сервере sql, Sql, sql получить дату без времени, Sql ServerBasavaraj Biradar

Много раз мы сталкивались со сценарием, когда нам нужно получить часть даты только из даты и времени на сервере Sql. Есть несколько способов сделать это, здесь я перечисляю некоторые из них:

1) Нижеприведенный подход работает в Sql Server 2008 и выше:

 SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
РЕЗУЛЬТАТ:
Только часть даты
--------------
2013-07-14 

2) Нижеприведенные подходы работают во всех версиях сервера Sql

i) Получить часть даты только из DateTime с помощью функции CONVERT
Пример 1:

 SELECT CONVERT(VARCHAR(10), GETDATE(), 112) 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
--------------
20130714 

Пример 2:

 SELECT CONVERT(VARCHAR(10), GETDATE(), 111) 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
--------------
14. 07.2013 

Результаты приведенного выше запроса имеют тип VARCHAR. Если мы хотим, чтобы результат имел тип DATETIME, мы можем написать запрос, как показано ниже:

Пример 1:

 SELECT CONVERT(DATETIME,
CONVERT(VARCHAR(10), GETDATE(), 112)) 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
-----------------------
2013-07-14 00:00:00.000 

Пример 2:

 SELECT CONVERT(DATETIME,
CONVERT(VARCHAR(10), GETDATE(), 111)) 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
-----------------------
2013-07-14 00:00:00.000 

ii) Получить часть даты только из DateTime с помощью функций DateTime

С точки зрения производительности это лучший подход вместо того, чтобы сначала преобразовывать DATETIME в VARCHAR, а затем VARCHAR в DATETIME.

Пример 1:

 SELECT DATEADD(dd, 0,
        DATEDIFF(dd, 0, GETDATE())) 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
-----------------------
2013-07-14 00:00:00. 000 

Пример 2:

 DECLARE @DatePartOnly DATETIME
SEt @DatePartOnly = DATEDIFF(DD, 0, GETDATE())
SELECT @DatePartOnly 'Только часть даты'
РЕЗУЛЬТАТ:
Только часть даты
-----------------------
2013-07-14 00:00:00.000 

iii) Получить часть даты только из DateTime с помощью функций FLOOR и CAST

Как мы знаем, Sql Server внутренне хранит DATETIME как два 4-байтовых целых числа. Первые 4 байта хранят количество дней, прошедших с даты начала типа DATETIME SQL Server 19.000101. Вторые 4 байта хранят время суток, т. е. часы с полуночи. Каждый такт часов эквивалентен 3,33 миллисекундам.

Таким образом, с указанными выше внутренними хранилищами DATETIME мы можем сначала преобразовать DATETIME в DECIMAL, затем из десятичной части игнорировать дробную часть и получить только целую часть. Наконец, преобразуйте целое число в DATETIME, как показано ниже:

 SELECT CAST( -- Преобразуйте целое число в DATE
 FLOOR(-- Получить наибольшее целое число, меньшее или равное десятичному значению
 CAST(GETDATE() AS DECIMAL(12, 5)) -- Преобразование DATETIME в DECIMAL
 )
 AS DATETIME) «Только часть даты»
РЕЗУЛЬТАТ:
Только часть даты
-----------------------
2013-07-14 00:00:00.