Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1136886694
Term
2006-01-10 12:51
2006.01.29
Округление


1-1135510556
Мастер Ломастер
2005-12-25 14:35
2006.01.29
Помогите написать функцию создания класса!


6-1129419739
antoxa2005
2005-10-16 03:42
2006.01.29
Подскажите, как послать запрос серверу и получить ответ.


2-1136884392
Pazitron_Brain
2006-01-10 12:13
2006.01.29
IP сообщение


9-1124515414
MasacreAnt
2005-08-20 09:23
2006.01.29
Collision Detection сфера - полигон, ну или полигон-полигон





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский