Перетворення дати (t-sql)

Є всі складові дати в змінних типу int
Як сформувати повну дату?

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


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

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


> Zz_ # XA0; (25.11.05 12:50) [2]

Тобто ви вважаєте цей спосіб цілком прийнятним?
Я думала, що є що-небудь більш елегантне.
Ну, раз майстри радять, # XA0; так і зроблю.
Дякуємо.

Ну це перше, що в голову прийшло. Можна і крутіше перекрутити. # XA0;: о)

Зроби з інтов рядок дати в форматі odbc-canonical
"Yyyy-mm-ddd"

>> Ольга # XA0; (25.11.05 12:56) [4]

>> Тобто ви вважаєте цей спосіб цілком прийнятним?
>> Я думала, що є що-небудь більш елегантне.

Це НАЙБІЛЬШИЙ швидкий спосіб за часом виконання
елегантні способи безбожно гальмують

І наступити на граблі

"Yyyy-mm-ddd" - це правильно з'їсть будь-сервер?

>> Ольга # XA0; (25.11.05 13:03) [8]


> Ольга # XA0; (25.11.05 13:03) [8]
> "Yyyy-mm-ddd" - це правильно з'їсть будь-сервер?

Для повної впевненості, що з'їсть (мова, ессесно, тільки про MS SQL):

"Yyyy-mm-ddd" - це правильно з'їсть будь-сервер?

Будь MSSQL прийме цей рядок

> "YYYYMMDDHHmmSS", ан ніяк.
"Yyyymmdd hh: nn: ss: zzz"

> Для всіх чи MSSQL-їв нульова дата буде "19000101"
щоб не морочитися на цю, і інші, тему ВИКОРИСТОВУЙ ПАРАМЕТРИ

"Yyyymmdd hh: nn: ss: zzz"
Містика, справді така конструкція працює, начебто це перше, що я пробувала.
Спасобо, тепер буду знати.

> ВИКОРИСТОВУЙ ПАРАМЕТРИ

В даному випадку це не підходить, тому що мова йде про збереженій процедурі, в тілі якої потрібна дата і час формуються за деякими критеріями.

> В даному випадку це не підходить, тому що мова йде про збереженій процедурі, в тілі якої потрібна дата і час формуються
> По деяким критеріям.
"Деякі критерії" не можуть обробляти числа? їм тільки рядки подавай?

-----------------------------
ми самі створюємо собі труднощі, які потім героїчно долаємо.

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


> Всі ці натяки на "деякі критерії" це захист власних
> Зручностей замість швидкості і безглючная роботи програм.
> Відмазки строго голворя. имхо.

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

-- варіант 1
set @ d = cast (cast (DatePart (year, GetDate () - 1) as char (4)) +
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; cast (DatePart (month, GetDate () - 1) as char (2)) +
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; cast (DatePart (day, GetDate () - 1) as char (2)) +
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; "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))))

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

мій варіант (есстественно саме його я і вважаю найкращим і безглючная)

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

Да уж, простенько і зі смаком.
Чомусь самої в голову не прийшло привести дату до float.
Дякуємо.

Дату швидше округляти так:
dateadd (dd, datediff (dd, "", getdate ()), "")

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

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

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

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

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

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

так ще й запис простіше вийдуть (коротше)
print DateAdd (hh, 22, DateDiff (dd, 0, GetDate ()) - 1)

Вік живи вік учись.

Схожі статті