Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удалить несуществующие даты  [new]
philips
Member

Откуда:
Сообщений: 365
Есть таблица (табель) - столбцы год, месяц, дни (всегда от 1 до 31).
Делаю UNPIVOT - получаю строки - год, месяц, день. Теперь их преобразовываю в дату - UPdate.
Надо выкинуть предварительно несуществующие даты (типа 30 февраля, 31 апреля) .
Есть ли какой то быстры алгоритм - без создания календаря , обработки каждой строки в цикле и т.д. (строк то миллион)
18 окт 12, 09:49    [13338298]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
philips
Есть таблица (табель) - столбцы год, месяц, дни (всегда от 1 до 31).
Делаю UNPIVOT - получаю строки - год, месяц, день. Теперь их преобразовываю в дату - UPdate.
Надо выкинуть предварительно несуществующие даты (типа 30 февраля, 31 апреля) .
Есть ли какой то быстры алгоритм - без создания календаря , обработки каждой строки в цикле и т.д. (строк то миллион)
Где структура таблицы?
Опубликуйте CREATE TABLE
18 окт 12, 09:55    [13338338]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
Добрый Э - Эх
Guest
Ну, кроме февраля все остальные месяца как бы стабильны...
18 окт 12, 09:57    [13338355]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
philips,

13334373
set dateformat YMD

alexeyvg - спасибо (вчера забыл сказать), ISDATE без этого нельзя использовать.


а затем 13331971
поправьте скрипт под свою задачу.
18 окт 12, 10:00    [13338377]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Если день, месяц и год - типа INT, то
WHERE ISDATE(10000*[год]+100*[месяц]+[день])=0
18 окт 12, 10:01    [13338387]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
trew
philips,

13334373
set dateformat YMD

alexeyvg - спасибо (вчера забыл сказать), ISDATE без этого нельзя использовать.
Это почему??
18 окт 12, 10:02    [13338392]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Если день, месяц и год - типа INT, то
WHERE ISDATE(10000*[год]+100*[месяц]+[день])=0
Это я проверку неправильных дат тут написал. Для правильных вернётся 1
18 окт 12, 10:03    [13338403]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap,

Возвращаемое функцией ISDATE значение зависит от настроек, установленных инструкциями SET DATEFORMAT, SET LANGUAGE
18 окт 12, 10:04    [13338410]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
philips
Member

Откуда:
Сообщений: 365
Спасибо
18 окт 12, 10:09    [13338444]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
trew
iap,

Возвращаемое функцией ISDATE значение зависит от настроек, установленных инструкциями SET DATEFORMAT, SET LANGUAGE
Если только строка с датой не имеет стандартный формат типа 'YYYYMMDD' или 'YYYY-MM-DDThh:mm:ss.nnn' и т.п.
В данном случае именно так и можно строку сформировать
18 окт 12, 10:16    [13338500]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
Humanitis
Member

Откуда:
Сообщений: 4
DECLARE @year INT,
		@month INT,
		@day INT
		
SELECT @year=0,@month=1001,@day=1

SELECT ISDATE(@year*10000+@month*100+@day)


Вернет 1
18 окт 12, 10:29    [13338608]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Humanitis
DECLARE @year INT,
		@month INT,
		@day INT
		
SELECT @year=0,@month=1001,@day=1

SELECT ISDATE(@year*10000+@month*100+@day)


Вернет 1
Значит, это правильная дата!!
18 окт 12, 10:34    [13338642]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Кстати говоря, если абстрагироваться от SQL2000 и SQL2005, то ISDATE не всегда правильно работает!
SELECT CAST('00010101' AS DATE), ISDATE('00010101');
18 окт 12, 10:42    [13338723]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Humanitis
DECLARE @year INT,
		@month INT,
		@day INT
		
SELECT @year=0,@month=1001,@day=1

SELECT ISDATE(@year*10000+@month*100+@day)


Вернет 1
DECLARE @Y INT=0,@M INT=1001,@D INT=1;
SELECT ISDATE(REPLACE(STR(@Y,4)+'-'+STR(@M,2)+'-'+STR(@D,2)+'T00:00:00',' ','0'));
18 окт 12, 10:50    [13338778]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Кстати говоря, если абстрагироваться от SQL2000 и SQL2005, то ISDATE не всегда правильно работает!
SELECT CAST('00010101' AS DATE), ISDATE('00010101');
Кстати, коллеги, это так же и в SQL2012 работает?
18 окт 12, 11:11    [13338916]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
Humanitis
Member

Откуда:
Сообщений: 4
iap
iap
Кстати говоря, если абстрагироваться от SQL2000 и SQL2005, то ISDATE не всегда правильно работает!
SELECT CAST('00010101' AS DATE), ISDATE('00010101');
Кстати, коллеги, это так же и в SQL2012 работает?


Таки, да. Только для справки SQL2012 дописали
Note that the range for datetime data is 1753-01-01 through 9999-12-31, while the range for date data is 0001-01-01 through 9999-12-31
18 окт 12, 11:16    [13338950]     Ответить | Цитировать Сообщить модератору
 Re: Удалить несуществующие даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Humanitis
iap
пропущено...
Кстати, коллеги, это так же и в SQL2012 работает?


Таки, да. Только для справки SQL2012 дописали
Note that the range for datetime data is 1753-01-01 through 9999-12-31, while the range for date data is 0001-01-01 through 9999-12-31
То есть проверки для типов DATETIME2, DATETIMEOFFSET, DATE значений меньше '17530101' в T-SQL нет!
18 окт 12, 11:19    [13338985]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить