Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование даты (T-SQL) [MSSQL]


Страницы:   1 2

Ольга ©   (2005-11-25 12:13:00) 

Есть все составляющие даты в переменных типа int
Как сформировать полную дату?

declare @god int, @mes int, @day int, @hour int, @min int, @s int
declare @dd datetime

set @god=2005
set @mes=11
set @day=25
set @hour=1
set @min=0
set @s=0

set @dd= ???


Ольга   (2005-11-27 15:31:00) [1]

Век живи - век учись.


sniknik   (2005-11-27 13:05:00) [2]

так еще и запись проще получатся (короче)
print DateAdd(hh,22,DateDiff(dd, 0, GetDate())-1)


sniknik   (2005-11-27 13:00:00) [3]

Fay ©   (27.11.05 12:36) [27]
значит надо заменить округление в приведенном варианте на это


Fay   (2005-11-27 12:40:00) [4]

2 sniknik ©   (27.11.05 11:15) [25]

set nocount on
declare
 @diff_1 int,
 @diff_2 int,
 @dummy datetime,
 @dt datetime,
 @i int,
 @n int

select
 @dt = GetDate(),
 @i = 0,
 @n = 99999

while @i < @n begin
  select
    @i = @i + 1,
    @dummy = round(cast(@dt as float), 0, 1)
end

select
 @diff_1 = datediff(ms, @dt, getdate()),
 @dt = getdate(),
 @i = 0

while @i < @n begin
  select
    @i = @i + 1,
    @dummy = dateadd(hh, 22, dateadd(dd, datediff(dd, '', @dt), ''))
end

select @diff_2 = datediff(ms, @dt, getdate())

select
 dt = @dummy,
 ms_1 = @diff_1,
 ms_2 = @diff_2


Fay   (2005-11-27 12:36:00) [5]

2 sniknik ©   (27.11.05 11:15) [25]

Дату быстрее округлять так :
dateadd(dd, datediff(dd, '', getdate()), '')


Ольга   (2005-11-27 11:29:00) [6]

Да уж, простенько и со вкусом.
Почему-то самой в голову не пришло привести дату к float.
Спасибо.


sniknik   (2005-11-27 11:15:00) [7]

> Универсально для любого MSSQL.
вот это блаж, избавься от нее. (неохота проверять но в 6.5 наверняка нет всех функций 2000-го, возможно и какихто функций дататама)

> Так какой из 2-х предложенных вариантов более безглючный
тебе точно ответить? а если мне оба не нравятся?
и еще, у тебя конкретный частный случай, надо сделать -> [24] так какого черта ты задаеш обший и значит расплывчатый вопрос "Преобразование даты (T-SQL)"?
23 поста изза этого воду в ступе мололи...

мой вариант (есстественно именно его я и считаю самым лучшим и безглючным)

print DATEADD(hh,22,Round(Cast(GetDate() AS Float)-1, 0, 1))


Ольга   (2005-11-27 10:44:00) [8]


> все эти намеки на "некоторые критерии" это защита собственных
> удобств взамен скорости и безглючности работы программ.
> отмазки строго голворя. имхо.

Не-е, я хочу сделать хорошо и грамотно. Универсально для любого MSSQL.
Задача:  процедура должна писать данные с такой датой - вчера на 22:00
Так какой из 2-х предложенных вариантов более безглючный (скорость не волнует - дата вычисляется один раз):
DECLARE @d datetime, @year int, @month int, @day int

-- вариант 1
set @d=cast(cast(DatePart(year,GetDate()-1) as char(4))+
                 cast(DatePart(month,GetDate()-1) as char(2))+
                 cast(DatePart(day,GetDate()-1) as char(2))+
                 ' 22:00:00' as datetime)
print @d

-- вариант 2
SET @year=DATEPART(year,GetDate()-1)
SET @month=DATEPART(month,GetDate()-1)
SET @day=DATEPART(day,GetDate()-1)
SELECT @d=DATEADD(hour,22,DATEADD(day,@day-1,DATEADD(month,@month-1,DATEADD(year,@year-1900,0))))

print @d


sniknik   (2005-11-26 15:34:00) [9]

p.s.
"вычленить" из числа(дататайм) например месяц и положить в другое число, компютеру проше и быстрее чем из строкового представления даты "выковырять" и сконвертить в тоже число. сравнить числа ему тоже проще... и т.д.
в отличие от человека который строку сразу видит а число еще разобрать надо, понять что это дата в нем...
т.что. все эти намеки на "некоторые критерии" это защита собственных удобств взамен скорости и безглючности работы программ. отмазки строго голворя. имхо.


sniknik   (2005-11-26 15:26:00) [10]

> В данном случае это не подходит, т.к. речь идет о хранимой процедуре, в теле которой нужная дата и время формируются
> по некоторым критериям.
"некоторые критерии" не могут обрабатывать числа? им только строки подавай?

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


Ольга   (2005-11-26 15:09:00) [11]

'yyyymmdd hh:nn:ss:zzz'
Мистика, в самом деле такая конструкция работает, вроде это первое, что я пробовала.
Спасобо, теперь буду знать.

> ИСПОЛЬЗУЙ ПАРАМЕТРЫ

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


sniknik   (2005-11-26 14:45:00) [12]

> 'YYYYMMDDHHmmSS', ан никак.
'yyyymmdd hh:nn:ss:zzz'

> для всех ли MSSQL-ев нулевая дата будет '19000101'
чтобы не заморачиваться на эту, и другие, тему ИСПОЛЬЗУЙ ПАРАМЕТРЫ


Ольга   (2005-11-26 14:20:00) [13]


> людЯм больше нравится '2005-01-02'. Не знаю почему - я их
> (людёв) не понимаю...

людЯм очень нравится 'YYYYMMDD', но хотелось бы продолжить эту прелесть:
'YYYYMMDDHHmmSS', ан никак.
Сделала, как советовал Zz_, вполне устраивает. Вызывает беспокойство только одно обстоятельство: для всех ли MSSQL-ев нулевая дата будет '19000101'


Fay   (2005-11-25 17:47:00) [14]

2 ANB ©   (25.11.05 17:11) [13]
> Как строку съест всегда так : '20051125'.
Это конечно, только людЯм больше нравится '2005-01-02'. Не знаю почему - я их (людёв) не понимаю...


Fay   (2005-11-25 17:45:00) [15]

Reindeer Moss Eater ©   (25.11.05 17:34) [16]
8)


Reindeer Moss Eater   (2005-11-25 17:34:00) [16]

Опечатка
'yyyy-mm-dd'


Fay   (2005-11-25 17:33:00) [17]

Reindeer Moss Eater ©   (25.11.05 17:22) [14]
а чё не 'yyyy-mm-ddddddd' ?


Reindeer Moss Eater   (2005-11-25 17:22:00) [18]

'yyyy-mm-ddd' - это правильно скушает любой сервер?

Любой MSSQL примет эту строку


ANB   (2005-11-25 17:11:00) [19]

Как строку съест всегда так : '20051125'.


Nikolay M.   (2005-11-25 13:12:00) [20]


> Ольга   (25.11.05 13:03) [8]
> 'yyyy-mm-ddd' - это правильно скушает любой сервер?

Для полной уверенности, что скушает (речь, ессесно, только про MS SQL):

SELECT CONVERT (DATETIME, '2005-01-02', 20)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо