Форум: "Базы";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизПреобразование даты (T-SQL) Найти похожие ветки
← →
Ольга (2005-11-25 12:13) [0]Есть все составляющие даты в переменных типа 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= ???
← →
Ega23 © (2005-11-25 12:37) [1]DATEADD ?
← →
Zz_ (2005-11-25 12:50) [2]
declare @god int, @mes int, @day int, @hour int, @min int, @sec int
declare @dd datetime
set @god = 2005
set @mes = 11
set @day = 25
set @hour = 1
set @min = 33
set @sec = 55
set @dd = dateadd(ss,@sec,dateadd(mi,@min,dateadd(hh,@hour,dateadd(dd,@day-1,dateadd(mm,@mes-1,dateadd(yy,@god-1900,""))))))
print @dd
← →
Ольга (2005-11-25 12:51) [3]
> Ega23 © (25.11.05 12:37) [1]
К какой дате добавлять?
set @d=0
DATEADD(yyyy,@god-1900,@d) и т.д. ?
Как-то криво.
← →
Ольга (2005-11-25 12:56) [4]
> Zz_ (25.11.05 12:50) [2]
То есть вы считаете этот способ вполне приемлемым?
Я думала, что есть что-нибудь более элегантное.
Ну, раз мастера советуют, так и сделаю.
Спасибо.
← →
Ega23 © (2005-11-25 12:57) [5]
> Как-то криво.
Ну это первое, что в голову пришло. Можно и круче извратиться. :о)
← →
Reindeer Moss Eater © (2005-11-25 12:58) [6]Сделай из интов строку даты в формате odbc-canonical
"yyyy-mm-ddd"
← →
Zz_ (2005-11-25 13:02) [7]>>Ольга (25.11.05 12:56) [4]
>>То есть вы считаете этот способ вполне приемлемым?
>>Я думала, что есть что-нибудь более элегантное.
Это САМЫЙ быстрый способ по времени исполнения
элегантные способы безбожно тормозят
>>Reindeer Moss Eater © (25.11.05 12:58) [6]
>>Сделай из интов строку даты в формате odbc-canonical "yyyy-mm-ddd"
И наступить на грабли
← →
Ольга (2005-11-25 13:03) [8]"yyyy-mm-ddd" - это правильно скушает любой сервер?
← →
Zz_ (2005-11-25 13:05) [9]>>Ольга (25.11.05 13:03) [8]
НЕТ !!!
← →
Zz_ (2005-11-25 13:06) [10]
set dateformat dmy
print dateadd(dd,0,"2005-11-05")
set dateformat mdy
print dateadd(dd,0,"2005-11-05")
← →
sniknik © (2005-11-25 13:11) [11]Zz_ (25.11.05 13:06) [10]
set dateformat dmy
print dateadd(dd,0,"20051105")
set dateformat mdy
print dateadd(dd,0,"20051105")
← →
Nikolay M. © (2005-11-25 13:12) [12]
> Ольга (25.11.05 13:03) [8]
> "yyyy-mm-ddd" - это правильно скушает любой сервер?
Для полной уверенности, что скушает (речь, ессесно, только про MS SQL):SELECT CONVERT (DATETIME, "2005-01-02", 20)
← →
ANB © (2005-11-25 17:11) [13]Как строку съест всегда так : "20051125".
← →
Reindeer Moss Eater © (2005-11-25 17:22) [14]"yyyy-mm-ddd" - это правильно скушает любой сервер?
Любой MSSQL примет эту строку
← →
Fay © (2005-11-25 17:33) [15]Reindeer Moss Eater © (25.11.05 17:22) [14]
а чё не "yyyy-mm-ddddddd" ?
← →
Reindeer Moss Eater © (2005-11-25 17:34) [16]Опечатка
"yyyy-mm-dd"
← →
Fay © (2005-11-25 17:45) [17]Reindeer Moss Eater © (25.11.05 17:34) [16]
8)
← →
Fay © (2005-11-25 17:47) [18]2 ANB © (25.11.05 17:11) [13]
> Как строку съест всегда так : "20051125".
Это конечно, только людЯм больше нравится "2005-01-02". Не знаю почему - я их (людёв) не понимаю...
← →
Ольга (2005-11-26 14:20) [19]
> людЯм больше нравится "2005-01-02". Не знаю почему - я их
> (людёв) не понимаю...
людЯм очень нравится "YYYYMMDD", но хотелось бы продолжить эту прелесть:
"YYYYMMDDHHmmSS", ан никак.
Сделала, как советовал Zz_, вполне устраивает. Вызывает беспокойство только одно обстоятельство: для всех ли MSSQL-ев нулевая дата будет "19000101"
← →
sniknik © (2005-11-26 14:45) [20]> "YYYYMMDDHHmmSS", ан никак.
"yyyymmdd hh:nn:ss:zzz"
> для всех ли MSSQL-ев нулевая дата будет "19000101"
чтобы не заморачиваться на эту, и другие, тему ИСПОЛЬЗУЙ ПАРАМЕТРЫ
← →
Ольга (2005-11-26 15:09) [21]"yyyymmdd hh:nn:ss:zzz"
Мистика, в самом деле такая конструкция работает, вроде это первое, что я пробовала.
Спасобо, теперь буду знать.
> ИСПОЛЬЗУЙ ПАРАМЕТРЫ
В данном случае это не подходит, т.к. речь идет о хранимой процедуре, в теле которой нужная дата и время формируются по некоторым критериям.
← →
sniknik © (2005-11-26 15:26) [22]> В данном случае это не подходит, т.к. речь идет о хранимой процедуре, в теле которой нужная дата и время формируются
> по некоторым критериям.
"некоторые критерии" не могут обрабатывать числа? им только строки подавай?
-----------------------------
мы сами создаем себе трудности, которые потом героически преодолеваем.
← →
sniknik © (2005-11-26 15:34) [23]p.s.
"вычленить" из числа(дататайм) например месяц и положить в другое число, компютеру проше и быстрее чем из строкового представления даты "выковырять" и сконвертить в тоже число. сравнить числа ему тоже проще... и т.д.
в отличие от человека который строку сразу видит а число еще разобрать надо, понять что это дата в нем...
т.что. все эти намеки на "некоторые критерии" это защита собственных удобств взамен скорости и безглючности работы программ. отмазки строго голворя. имхо.
← →
Ольга (2005-11-27 10:44) [24]
> все эти намеки на "некоторые критерии" это защита собственных
> удобств взамен скорости и безглючности работы программ.
> отмазки строго голворя. имхо.
Не-е, я хочу сделать хорошо и грамотно. Универсально для любого 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-27 11:15) [25]> Универсально для любого MSSQL.
вот это блаж, избавься от нее. (неохота проверять но в 6.5 наверняка нет всех функций 2000-го, возможно и какихто функций дататама)
> Так какой из 2-х предложенных вариантов более безглючный
тебе точно ответить? а если мне оба не нравятся?
и еще, у тебя конкретный частный случай, надо сделать -> [24] так какого черта ты задаеш обший и значит расплывчатый вопрос "Преобразование даты (T-SQL)"?
23 поста изза этого воду в ступе мололи...
мой вариант (есстественно именно его я и считаю самым лучшим и безглючным)
print DATEADD(hh,22,Round(Cast(GetDate() AS Float)-1, 0, 1))
← →
Ольга (2005-11-27 11:29) [26]Да уж, простенько и со вкусом.
Почему-то самой в голову не пришло привести дату к float.
Спасибо.
← →
Fay © (2005-11-27 12:36) [27]2 sniknik © (27.11.05 11:15) [25]
Дату быстрее округлять так :
dateadd(dd, datediff(dd, "", getdate()), "")
← →
Fay © (2005-11-27 12:40) [28]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
← →
sniknik © (2005-11-27 13:00) [29]Fay © (27.11.05 12:36) [27]
значит надо заменить округление в приведенном варианте на это
← →
sniknik © (2005-11-27 13:05) [30]так еще и запись проще получатся (короче)
print DateAdd(hh,22,DateDiff(dd, 0, GetDate())-1)
← →
Ольга (2005-11-27 15:31) [31]Век живи - век учись.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.057 c