Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Преобразование даты (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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.044 c
2-1136962318
barograph
2006-01-11 09:51
2006.01.29
Господа помогите разобраться


2-1137328158
Ell
2006-01-15 15:29
2006.01.29
Как сымитировать нажатие клавиши?


1-1135653112
boalse
2005-12-27 06:11
2006.01.29
Редактирование текста в своём формате.


15-1136561056
Барлог(с)
2006-01-06 18:24
2006.01.29
Чат в локальной сети. Какой поставить?


15-1136901397
psa247
2006-01-10 16:56
2006.01.29
Драйвер FileMon !