Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
SQL сервер DateTime сбой преобразования
У меня есть большая таблица с 1 миллионом+ записей. К сожалению, человек, создавший таблицу, решил поместить даты в поле varchar(50) .
Мне нужно сделать простое сравнение дат -
datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Но он терпит неудачу на convert() :
Conversion failed when converting datetime from character string.
По-видимому, в этой области есть что-то, что ему не нравится, и поскольку существует так много записей, я не могу сказать, просто взглянув на нее. Как я могу правильно очистить все поле даты, чтобы оно не провалилось на convert() ? Вот что у меня сейчас есть:
select count(*)
from MyTable
where
isdate(lastUpdate) > 0
and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Я не беспокоюсь о производительности в этом случае. Это будет одноразовый запрос. Изменение таблицы на поле datetime не является опцией.
Я попытался добавить третий аргумент, но это не имеет никакого значения.
Проблема скорее всего в том, как хранятся данные, есть только два безопасных формата; ISO YYYYMMDD; ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm (без пробелов)
Разве чек isdate() не позаботится об этом?
Мне не нужна точность 100%. Я просто хочу получить большую часть записей за последние 30 дней.
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
Поместите CASE и ISDATE внутри функции CONVERT().
Спасибо! Вот и все.
Как насчет того, чтобы написать курсор для циклического перебора содержимого, пробуя приведение для каждой записи?При возникновении ошибки выведите первичный ключ или другие идентифицирующие сведения для записи проблемы.
Я не могу придумать способ сделать это на основе набора.
Как насчет того, чтобы написать курсор для циклического перебора содержимого, пробуя приведение для каждой записи?При возникновении ошибки выведите первичный ключ или другие идентифицирующие сведения для записи проблемы. Я не могу придумать способ сделать это на основе набора.
Не совсем setbased но если только 3 строки из 1 миллиона плохи это сэкономит вам много времени
select * into BadDates
from Yourtable
where isdate(lastUpdate) = 0
select * into GoodDates
from Yourtable
where isdate(lastUpdate) = 1
тогда просто посмотрите на таблицу BadDates и исправьте это
ISDATE() будет заботиться о строках, которые не были отформатированы должным образом, если он действительно выполнялся первым. Однако, если вы посмотрите на план выполнения, вы, вероятно, обнаружите, что предикат DATEDIFF применяется первым - таким образом, причина вашей боли.
Если вы используете SQL Server Management Studio, нажмите CTRL + L для просмотра предполагаемого плана выполнения конкретного запроса.
Помните, что SQL-это не процедурный язык, и логика короткого замыкания может работать, но только если вы будете осторожны в том, как вы ее применяете.
Как насчет того, чтобы написать курсор для циклического перебора содержимого, пробуя приведение для каждой записи?
При возникновении ошибки выведите первичный ключ или другие идентифицирующие сведения для записи проблемы.
Я не могу придумать способ сделать это на основе набора.
Edit -Ах да, я забыл про ISDATE(). Определенно лучший подход, чем использование курсора. +1 к SQLMenace.
Я уверен, что изменение таблицы / столбца не может быть опцией из-за каких-либо устаревших системных требований, но вы думали о создании представления, которое имеет встроенную логику преобразования даты, если вы используете более свежую версию sql, то вы, возможно, даже можете использовать индексированное представление?
Я бы предложил убрать беспорядок и изменить столбец на datetime, потому что делать такие вещи, как это
WHERE datediff(dd, convert(datetime, lastUpdate), getDate()) < 31
нельзя использовать индекс, и он будет во много раз медленнее, чем если бы у вас было datetime colum, n и did
where lastUpdate > getDate() -31
Вы также должны учитывать часы и секунды конечно
В вызове convert вам необходимо указать третий параметр стиля, например, формат дат, которые хранятся как varchar, как указано в этом документе: CAST и CONVERT (T-SQL)
Проблема, скорее всего, в том, как хранятся данные, есть только два безопасных формата
ISO YYYYMMDD
ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm(без пробелов)
они будут работать независимо от того, какой у вас язык.
Возможно, Вам потребуется сделать набор DATEFORMAT YMD (или как там хранятся данные), чтобы заставить его работать