Проблема обработки даты на сервере SQL - PullRequest
0 голосов
/ 03 апреля 2012

Я устал работать над этим сам, я не могу понять, как работает поле sql datetime, его действительно так плохо понимать, сейчас прошло 2 часа.

Проблема:

IУ меня есть база данных доступа, и я переместить ее в таблицу SQL Server 2008 R2 (импортировать все).

Теперь у меня есть даты в таблице SQL, как;

2012-04-03 00:00:00.000
2012-04-04 00:00:00.000
2012-04-05 00:00:00.000
2012-04-04 00:00:00.000
2012-04-05 00:00:00.000
2012-04-09 00:00:00.000
2012-04-09 00:00:00.000

И как этот SQL работает сдата, когда я даже не могу понять, где это: гггг / мм / дд или гггг / дд / мм.

Потому что, когда я запускаю этот запрос:

Select * from Contractor_Appointments where app_date  Between '02/04/2012' and '02/04/2012' 

Он должен вернуть все результаты из 2 /Апр / 2012 вместо этого я получаю:

2012-02-04 00:00:00.000
2012-02-04 00:00:00.000
2012-02-04 00:00:00.000
2012-02-04 00:00:00.000

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

2012-02-04 00:00:00.000

И затем появляется в приведенном выше запросе:(пожалуйста, помогите, я устал от этой обработки даты sql. Мой компьютер установлен на 02/04/2012.

Любое предложение:

Спасибо

Ответы [ 4 ]

0 голосов
/ 03 апреля 2012

Чтобы понять формат, в котором хранится дата, попробуйте преобразовать ее во что-то более понятное.Использование функции SQL Server CONVERT:

SELECT TOP 10 
    CONVERT(VARCHAR(26), app_date, 109),
    *
FROM Contractor_Appointments

Это вернет гораздо более четкую дату, например: Apr 28 2006 12:32:29:253PM

См. Эту ссылку для получения дополнительных форматов преобразования: http://www.sql -server-helper.com / советы / дата-formats.aspx

0 голосов
/ 03 апреля 2012

Почему не в том же формате?

Select * 
from Contractor_Appointments 
where app_date  Between '2012-02-04' and '2012-02-04'

Чтобы узнать, какая часть месяца

select datepart(MONTH,app_date)
from from Contractor_Appointments 
0 голосов
/ 03 апреля 2012

У вас есть две проблемы;каждый понимает, как SQL Server работает с датами.В приведенном выше примере ваш запрос на самом деле:

SELECT * from Contractor_Appointments where app_date  Between '02/04/2012 00:00:00' and '02/04/2012 00:00:00'

Вы запрашиваете все встречи с полуночи до полуночи, что не так уж и плохо, за исключением вашей второй проблемы.Вы используете неоднозначный формат даты и времени.То, как SQL Server интерпретирует эту дату, будет зависеть от множества параметров - ваших региональных настроек и языка, который использует база данных, например.В вашем случае это фактически интерпретирует его как 4 февраля 2012 г., что говорит о том, что вы выполняете запрос на компьютере в США, или же язык вашей базы данных предназначен для региона, где формат даты - ММ / дд / гггг

Использованиевместо этого используется инвариантный формат даты и времени - это однозначно и не должно зависеть от региональных настроек.Примером инвариантного формата даты и времени является ггггМмдд ЧЧ: мм: сс

Таким образом, ваш запрос будет:

SELECT * from Contractor_Appointments where app_date  Between '20120402 00:00:00' and '20120403 00:00:00'

, который даст вам все встречи 2 апреля 2012 года (т.е. всемежду полночью 2 апреля и полуночью 3 апреля).

Вы могли бы так же легко написать свой запрос таким образом, учитывая, что ваши даты и время кажутся полуночными:

SELECT * FROM Contractor_Appointments WHERE app_date = '20120402 00:00:00'

См. этот ответ для получения дополнительной информации о том, как лучше форматировать даты при запросах в SQL Server.

РЕДАКТИРОВАТЬ

Для вашей вставки применяется то же самое.Вы должны использовать однозначный формат даты и времени.См. Этот вопрос для получения дополнительной информации , но эффективно:

INSERT INTO yourtable (date_column) VALUES ('20120402') даст вам то, что вы хотите.

Если у вас есть объект DateTime, то вызов DateTime.ToString("yyyyMMdd HH:mm:ss") даст вам правильно отформатированную строку.

0 голосов
/ 03 апреля 2012

Попробуйте запустить dbcc useroptions, чтобы увидеть, установлен ли Language на us_english, а dateformat на mdy

...