Использование производного столбца для создания значения даты в формате ГГГГ-ММ-01 00: 00: 00.000 для каждой строки - PullRequest
2 голосов
/ 08 октября 2010

У меня проблема с производными столбцами в службах SSIS.Когда в SSMS я могу установить для столбца значение по умолчанию, используя следующий код:

(dateadd(month,datediff(month,(0),getdate())-(1),(0)))

, и когда данные вводятся в базу данных, они будут указывать метку времени предыдущего месяца в следующем формате дляпример:

 2010-09-01 00:00:00.000

Странно, это то, что я ищу и пытаюсь продублировать / произвести аналогичное с использованием производного столбца DFT.* который производит месяц успешно, но GETDATE () не является правильной заменой 0 в исходном коде.

Означают ли 0 в исходном коде дату начала в SQL?

Любая помощь будет высоко ценится.

С уважением,

Lee

Ответы [ 4 ]

3 голосов
/ 08 октября 2010

ваш первый фрагмент кода является «настилом» даты-времени месяца (делая дату 1-й числа данного месяца без времени), «-1» делает его предыдущим месяцем. Все лишние лишние скобки в этом фрагменте кода вызывают головную боль, вот эквивалент:

dateadd(month,datediff(month,0,getdate())-1,0)

Вот как можно распределить дату и время по разным единицам:

--Floor a datetime
DECLARE @datetime datetime;
SET @datetime = '2008-09-17 12:56:53.430';

SELECT '0 None',  @datetime                                                                   -- none    2008-09-17 12:56:53.430
UNION SELECT '1 Second',DATEADD(second,DATEDIFF(second,'2000-01-01',@datetime),'2000-01-01')  -- Second: 2008-09-17 12:56:53.000
UNION SELECT '2 Minute',DATEADD(minute,DATEDIFF(minute,0,@datetime),0)                        -- Minute: 2008-09-17 12:56:00.000
UNION SELECT '3 Hour',  DATEADD(hour,DATEDIFF(hour,0,@datetime),0)                            -- Hour:   2008-09-17 12:00:00.000
UNION SELECT '4 Day',   DATEADD(day,DATEDIFF(day,0,@datetime),0)                              -- Day:    2008-09-17 00:00:00.000
UNION SELECT '5 Month', DATEADD(month,DATEDIFF(month,0,@datetime),0)                          -- Month:  2008-09-01 00:00:00.000
UNION SELECT '6 Year',  DATEADD(year,DATEDIFF(year,0,@datetime),0)                            -- Year:   2008-01-01 00:00:00.000
ORDER BY 1
PRINT' '
PRINT 'Note that when you are flooring by the second, you will often get an arithmetic overflow if you use 0. So pick a known value that is guaranteed to be lower than the datetime you are attempting to floor'
PRINT 'this always uses a date less than the given date, so there will be no arithmetic overflow'
SELECT '1 Second',DATEADD(second,DATEDIFF(second,DATEADD(day,DATEDIFF(day,0,@datetime),0)-1,@datetime),DATEADD(day,DATEDIFF(day,0,@datetime),0)-1)  -- Second: 2008-09-17 12:56:53.000

второй фрагмент кода не будет правильно указывать дату и время месяца, он будет только перемещать дату на предыдущий месяц и использовать тот же день и время, что и данное время даты.

Кроме того, я не уверен, что вы на самом деле спрашиваете.

Вот разбивка того, что происходит в первом фрагменте кода OP:

select convert(datetime,0),'first datetime "0"'
select datediff(month,0,getdate()), 'months difference between the first datetime (1900-01-01) and given "getdate()"'
select datediff(month,0,getdate())-1, 'months difference between the first datetime (1900-01-01) and month previous to given "getdate()"'
select dateadd(month,datediff(month,0,getdate())-1,0), 'takes the first datetime (1900-01-01) and adds 1328 months onto that'

ВЫВОД:

----------------------- ------------------
1900-01-01 00:00:00.000 first datetime "0"

----------- --------------------------------------------------------------------------------
1329        months difference between the first datetime (1900-01-01) and given "getdate()"

----------- --------------------------------------------------------------------------------------------------
1328        months difference between the first datetime (1900-01-01) and month previous to given "getdate()"

----------------------- --------------------------------------------------------------------
2010-09-01 00:00:00.000 takes the first datetime (1900-01-01) and adds 1328 months onto that
1 голос
/ 08 октября 2010

Вот то, что я думаю, вы можете искать. Это выражение служб SSIS, которое получает первый день предыдущего месяца для данного дня (в примере GETDATE ()).

DATEADD("mm",DATEDIFF("mm", (DT_DBTIMESTAMP)2, GETDATE()) - 1, (DT_DBTIMESTAMP)2)

Я попытался смоделировать вашу SQL-версию выражения, которая определяла количество месяцев между 0 datetime и текущим datetime. И затем это добавило количество месяцев к 0 datetime.

Не слишком важно, что такое 0 datetime, кроме того, что вы хотели 1-й день месяца. В SQL значение 0 datetime - 1900-01-01 00: 00: 00.000, поэтому добавление месяцев автоматически дает вам первый день месяца. В выражениях служб SSIS значение 0 - 1899-12-30 00: 00: 00.000. Так как вы хотите первый день месяца, вышеприведенное выражение относится к 2 datetime. Итак, в выражении (DT_DBTIMESTAMP)2 приведено число 2 к 1900-01-01 00: 00: 00.000.

0 голосов
/ 10 октября 2010

Я думаю, что вам нужно в вашем производном столбце этот синтаксис:

DATEADD("mm",-1,(DT_DBTIMESTAMP)((DT_WSTR,4)DATEPART("YYYY",GETDATE()) + "-" + (DT_WSTR,2)DATEPART("mm",GETDATE()) + "-01")) 
0 голосов
/ 08 октября 2010

month,0 округляет до начала месяца.

Разве вы не можете использовать свое первое выражение, если оно делает то, что вы хотите?Или используйте второе выражение, но поменяйте два GETDATE(), которые вы добавили, на 0. Вы получите ошибку, если попробуете это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...