powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DateSerial в t-sql
14 сообщений из 14, страница 1 из 1
DateSerial в t-sql
    #32066853
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, понадобилось сделать в SQL дату из года, месяца и числа.
Что-то ничего путного в голову не приходит.
Подкажите как лучьше.
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32066857
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может Вы имели ввиду это :
declare @Y int,@M int,@D int,@tmpDate nvarchar(500),@myDate as datetime
set @Y=2002
Set @M=11
set @D=12
set @tmpDate=cast(@Y as nvarchar(50))+'-'+cast(@m as nvarchar(500))+'-'+cast(@d as nvarchar(500))
set @myDate=cast(@tmpdate as datetime)
select @mydate
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32066896
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @dt datetime, @year int, @month int, @day int

 -- 28 Dec 1998
 
SET @year =  1998 
SET @month =  12 
SET @day =  28 

SET @dt = GETDATE()
SET @dt = DATEADD(yyyy, @year-YEAR(@dt), @dt)
SET @dt = DATEADD(mm, @month-MONTH(@dt), @dt)
SET @dt = DATEADD(dd, @day-DAY(@dt), @dt)

 -- Set Time if required ...
 

SELECT @dt
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32066960
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня сделано так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @date datetime, @year int, @month int, @day int
SET @year =  1998 
SET @month =  12 
SET @day =  28 

set @date = convert(datetime,convert(varchar,@year) + '.' + convert(varchar,@month) + '.' + convert(varchar,@day), 102 )

select @date

Но теперь, возможно, сделаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @date datetime, @year int, @month int, @day int
SET @year =  1998 
SET @month =  12 
SET @day =  28 
set @date =  0 

SET @date = DATEADD(yyyy, @year- 1900 , @date)
SET @date = DATEADD(mm, @month- 1 , @date)
SET @date = DATEADD(dd, @day- 1 , @date)

select @date

Хотя хрен его знает, что лучше.
Поэтому наверное сделаю UDF DATESERIAL() и буду ждать совета Glory :)
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32066980
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы остановился на:

set @date = convert(datetime,convert(varchar,@year) + '.' + convert(varchar,@month) + '.' + convert(varchar,@day),102)

ИМХО.
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32066988
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще проще...
Код: plaintext
set @date = CAST(convert(varchar,@year) + convert(varchar,@month) + convert(varchar,@day) as  datetime)

работает всегда
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32067006
Фотография Shura_M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MiCe.
ага, а попробуйте так с 1 декабря или 11 января
получится
set @date = CAST('2002111' as datetime)
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32067039
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тады ой....
чес гря ни когда не хранил в интегральных значениях....
хранил в строковых.... а они и склееваются правильно...
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #32067040
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set @date = CAST(convert(varchar,@year) + right("0"+convert(varchar(2),@month), 2) + right("0"+convert(varchar(2),@day), 2) as datetime)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
DateSerial в t-sql
    #39951811
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так бывает, что в массиве данных, нужно собрать дату из того что получилось в следствии какой-то математики.
Например есть дата договора - 01.03.2020
И нужно от каких-то условий посчитать дату, когда договор перестанет быть действующим. Как правило это спустя сколько-то лет, но датой на 1 день меньше.
То есть договор должен кончиться 28.02.2022
И вот чтобы 01.03.2020 - 1 = 29.02.2020 - разбирая дату на элементы, и потом прибавляя два года, собираем дату 29.02.2022.
Но, и тогда
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @D_Beg = '2020-03-01'
declare @yestoday date = dateadd(day, -1, @D_Beg) --'2020-02-29'
declare @ys integer = datepart(year,@yestoday)
declare @ms integer = datepart(month,@yestoday)
declare @ds integer = datepart(day,@yestoday)
				
declare @yc integer = @ys + 2 /*условно, договор должен закончиться через два года*/
declare @dc integer = case when @yc % 4 > 0 and @ds = 29 and @ms = 2 then 28 else @ds end -- если год високосный и февраль, то ...

cast(cast(@yc as char(4))+'-'+cast(@ms as char(2))+'-'+cast(@dc as char(2)) as date)



Понятное дело, что вместо +2 можно отработать аккуратней функциями dateadd , либо сначала добавлять два года, а потом отнимать 1 день... но метод как он есть
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #39951814
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SHKoder, есть такая функция eomonth - оперируете в своих выражениях месяцами, к результату применяете.
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #39951831
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
Понятное дело, что вместо +2 можно отработать аккуратней функциями dateadd , либо сначала добавлять два года, а потом отнимать 1 день... но метод как он есть
Понятно, что нужно добавлять два года, а потом отнимать 1 день, это лучше читается, и быстрее, и, главное, будет правильно работать, в отличие от кривого ужаса с cast в varchar
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #39951853
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если на самом деле нужна функция, запрошенная автором темы, то это datefromparts
...
Рейтинг: 0 / 0
DateSerial в t-sql
    #39952232
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С учетом того, что исходный топик - аж 2002 года - datefromparts ну никак не подходит.
Тогда 6.5 был в ходу и 7.0. И только-только начал появляться 2000.
Какой там datefromparts?
:-)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DateSerial в t-sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]