Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как выделить дату из типа datetime?  [new]
ivanopula
Guest
Уважаемые господа разработчики!

Подскажите, пожалуйста, как можно средствами SQL Server 7.0 выделить дату из типа datetime?
В Access аналог нужной функции DateValue().

С уважением,
Алекс.
8 сен 00, 20:26    [2601]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
judge
Администратор

Откуда: SQL.ru
Сообщений: 5978
Блог
Syntax
DATEPART(datepart, date)

Arguments
datepart
Is the parameter that specifies the part of the date to return. The table lists dateparts and abbreviations recognized by Microsoft SQL Server.

Datepart Abbreviations

year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms


Пример:

SELECT DATEPART(month, GETDATE())

Result:
-----------
5


Успехов, Александр.
9 сен 00, 07:17    [2602]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
ivanopula
Guest
Спасибо, уважаемый judge!

Функция DATEPART() действительно возвращает составляющие переменной типа datetime. Но у нее нет такого параметра (аббревиатуры), которая возвращала бы значение типа datetime, но с "отрезанным" временем. Например, имеется дата и время '08/25/00 12:30', результат, который мне нужен: '08/25/00' (но, поскольку это тип datetime, то на самом деле будет '08/25/00 0:00:00').

На mssqlserver.com в FAQ есть ответ на (похожий) вопрос, вот такой:

select convert(datetime,convert(char(10),getdate(),101))

Неужели, это самый простой способ отрезать время? :(
Дело в том, что мне нужно делать достаточно много таких вот "отрезаний", что приводит SQL код в такой вид, что разобраться в нём практически нереально. :(
А так хотелось бы ;)

F1

С уважением,
Алекс.
9 сен 00, 07:38    [2603]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
SergSuper
Guest
Можно еще и так:
select convert(datetime,convert(int,getdate()))
Будет несколько проще если сразу хранить день не в datetime, а в int
Т.е. в целой части храниться количество дней, в дробной - время.
А простых и удобных функций они почему-то не предусмотрели.
11 сен 00, 06:22    [2604]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Harry
Guest
Нет под рукой справочника, в общем когда то я резал дату при помощи selecta там при помощи неких двух операторов можно указывать количество обрезаемых знаков справа или с лева не помню только сами операторы...
22 ноя 00, 21:14    [2605]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Fompro
Member

Откуда:
Сообщений: 363
Простите, будет легче понять что нужно сделать, если узнать для чего Вам это нужно... Р.Е. если у Вас дата используется в WHERE , то Вы можете сравнивать их как WHERE date_time < '20001125' -- по умолчанию 112-й формат.
25 ноя 00, 19:29    [2606]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 RE:Как выделить дату из типа datetime?  [new]
aero
Guest
вариант с integer не работает в SQL7(только в нем проверял)
округление неправильное до 12 в меньшую сторону после 12 в большую
25 дек 01, 18:16    [2607]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
MadDog
Member

Откуда: Алматы
Сообщений: 415
Попробуйте так:
select convert(smalldatetime, convert(char(, getdate(), 112), 112)
26 дек 01, 04:38    [2608]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Слон
Member

Откуда:
Сообщений: 717
Я таким пользуюсь: CONVERT(smalldatetime, FLOOR(CONVERT(float, getdate())))
27 дек 01, 03:01    [2609]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Павел
Guest
Все гораздо проще. Дата, как правило, используется только для ограничения диапазона, поэтому выгоднее использовать функцию datediff(day, date_column, original_date).
28 дек 01, 11:28    [2610]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
qu-qu
Guest
А можно и так:

select dateadd(day,datediff(day,'19000101',getdate()),'19000101')

2 Павел
А использовать datediff(...) для сравнения полей в условии WHERE - это значит "забить" на любые индексы и тупо перебирать все записи в таблице с проверкой каждой строки на вычисление функции...
(офигенная производительность получится).
15 фев 02, 12:00    [2611]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Garya
Guest
Как я понимаю, вопрошающему нужно хранить дату операции без учета времени, поскольку последнее для операции смысла не имеет. На самом деле время будет храниться с датой вне зависимости от вашего желания. Нужно только сделать, чтобы его значение было всегда одинаковым. Например, 00:00. Делается это несколькими способами:
1. Дата преобразуется в строку с потерей при форматировании времени, а потом преобразуется обратно в дату (ты уже привел вариант)
2. Из даты с помощью DatePart() выделяется год, месяц и день, которые складывают между собой образуя дату.
3. Из даты-времени вычитают часы, минуты, секунды и миллисекунды.
4. Дата преобразуется в число, у которого откусывается дробная часть и которое преобразуется обратно.
Ни на закуску остается вариант, когда дата хранится не в поле DateTime, а, например, в поле int, в которое помещается целое значение в формате YYYYMMDD. Или в трех разных полях: YYYY, MM и DD. Последний вариант наиболее предпочтителен, ибо безо всяких вычислений позволяет группировать информацию по годам или месяцам.
15 фев 02, 17:59    [2612]     Ответить | Цитировать Сообщить модератору
 RE:Как выделить дату из типа datetime?  [new]
Barbar
Guest
Вот есть такой вариант

convert(char(60),@Date,112)
22 фев 02, 12:00    [2613]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как выделить дату из типа datetime?  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Подскажите пожалуйста как округлить дату до месяцев.

То есть
03.26.2003 11:11:11 -> 03.01.2003 00:00:00

Спасибо.
P.S. я честно искал на форуме
26 мар 03, 19:59    [157374]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Извините. В FAQ есть ответ.
26 мар 03, 20:18    [157384]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Опять не получается.

Подскажите плиз как получить разницу между датами в днях.
26 мар 03, 20:56    [157398]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
Glory
Member

Откуда:
Сообщений: 104760
1.
declare @d datetime

set @d = '20030326 11:11:11'
select @d, cast(convert(char(6), @d, 112) + '01' as datetime)


2.
select datediff(dd, @d1, @d2)
26 мар 03, 21:00    [157400]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
2 Glory

Спасибо.
27 мар 03, 10:25    [157688]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Все-таки не получается получить разницу между датами в днях.

select datediff(dd, @d1, @d2)


Возвращает дату.

А мне нужно например

27.03.2003 - 01.01.2003 = 86 дней.

Как это сделать? То есть нужно дату перевести в количество дней.
27 мар 03, 10:41    [157713]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Так всё правильно
select datediff(dd, '20030101', '20030327')
-----------
85
27 мар 03, 10:45    [157723]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Как выделить дату для группировки ?  [new]
Rakhim Dj
Member

Откуда:
Сообщений: 1
Для получение уникальных значений я пользуюсь GROUP BY
а когда это тип datetime после такого запроса

SELECT chislo FROM sales UNION
SELECT chislo FROM payments GROUP BY chislo

SQLServer даёт
01-05-2005 12:45:56
01-05-2005 12:52:45

С одной стороный это правильно но ,мне нужны уникальные Даты а не Дата+Время а здесь как быть?
25 мар 05, 14:03    [1415288]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату для группировки ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Rakhim Dj

С одной стороный это правильно но ,мне нужны уникальные Даты а не Дата+Время а здесь как быть?


FAQ
25 мар 05, 18:38    [1416543]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату для группировки ?  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Rakhim Dj
Для получение уникальных значений я пользуюсь GROUP BY
а когда это тип datetime после такого запроса

SELECT chislo FROM sales UNION
SELECT chislo FROM payments GROUP BY chislo

SQLServer даёт
01-05-2005 12:45:56
01-05-2005 12:52:45

С одной стороный это правильно но ,мне нужны уникальные Даты а не Дата+Время а здесь как быть?


SELECT SUM(SameValue) as SumOfSameValue
FROM ( 
    SELECT cast('01-05-2005 12:45:56' as datetime) as chislo, 123 as SameValue 
    UNION 
    SELECT cast('01-05-2005 12:52:45' as datetime) as chislo, 345 as SameValue
    ) t 
GROUP BY datediff(dd,0,chislo)
25 мар 05, 19:16    [1416594]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как выделить дату из типа datetime?  [new]
Demigod the SatanEye
Member

Откуда: Волгоград
Сообщений: 14
Declare @Date datetime

Set @Date = GetDate()

Convert(datetime,floor(convert(numeric(18,8),@Date)))


Сам пользуюсь, лучше и точнее еще не видел преобразования, в других способах бывали неточности.
Однако в SQL Server 2008 и старше можно использовать типы данных date и time
8 янв 13, 14:00    [13735779]     Ответить | Цитировать Сообщить модератору
 Re: Как выделить дату из типа datetime?  [new]
aleks2
Guest
Demigod the SatanEye
лучше и точнее еще не видел преобразования, в других способах бывали неточности.

1. Как мало ты видел в свой короткой жизни.

2. Уж если гоняться за точностью и документированностью

Declare @Date datetime
Set @Date = GetDate()

select dateadd(day, datediff(day, 0, @Date), 0) ; -- можно для пущей феншуйности 0 заменить на cast(0 as datetime)
8 янв 13, 15:03    [13736128]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить