![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование даты (T-SQL) [MSSQL]
Ольга © (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)