Преобразовать в datetime в SQL Server - PullRequest
0 голосов
/ 22 января 2019

У меня есть простой оператор SQL

select convert(datetime, '1/1/2018')

когда я смотрю на его вывод, я вижу, что он конвертируется в 2018-01-01 00:00:00.000. Возможно ли в разделе времени получить конец дня, а не начало дня?

Я использую это для извлечения данных, основанных на преобразованной дате, и не удается получить эту запись 1/1/2018 15:10:43 из-за времени.

Есть предложения?

Спасибо

Обновление

Похоже, я могу сделать SELECT DATEADD(ms, -3, '5/31/2018') + 1, чтобы решить мою проблему .. Получил идею от Здесь

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Если вы собираетесь использовать преобразованный datetime для сравнения, вы должны знать, что он всегда будет получать время 00: 00: 00.000. Это приведет к тому, что что-то в эту дату будет исключено из вашего набора результатов с более длительным временем.

Чтобы решить эту проблему, вам нужно установить время в поле, которое вы ищете, чтобы соответствовать. Приведенный ниже код приведет к тому, что каждый результат в вашем поле даты и времени будет иметь время 00: 00: 00.000, такое же, как ваша конвертированная дата.

(DATEADD(dd, DATEDIFF(dd, 0, my_col)
0 голосов
/ 22 января 2019

Когда я смотрю на результат, я вижу, что он преобразуется в 2018-01-31 00: 00: 00.000

Я не могу воспроизвести ваш результат. select convert(datetime,'1/1/2018') не возвращается 31 января. Возвращает 1 января.

Я использую это для извлечения данных на основе конвертированной даты, и это не удается чтобы получить эту запись 01.01.2008 15:10:43 из-за времени

Поскольку вы конвертируете его в DATETIME, он получает время 00:00:00, которое соответствует полуночи. Таким образом, он не может получить что-либо после полуночи, например 15:10 в тот же день. Проще всего сделать так, чтобы ваш оператор < на следующий день ... , чтобы вам не приходилось учитывать часы, минуты, секунды, миллисекунды ...

where fetch < '20180102'

Обратите внимание, что я не использовал convert, поскольку SQL Server справится с этим для нас, но не стесняйтесь добавлять его, если он станет более понятным для вас.

where fetch < convert(datetime,'20180102')

Также обратите внимание, что я использовал стандарты ANSI YYYYMMDD. Другие методы, которые могут вызвать проблемы, когда вы используете DATETIME2 или хотите получить более точное измерение, - это добавить seconds к вашей дате и использовать <=.

select dateadd(second,86399,convert(datetime,'20180101'))

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

За миллисекунды ...

select dateadd(millisecond,86399999,convert(datetime2,'20180101'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...