использование sql nvarchar (50) в качестве переменной даты на сервере sql

привет, ребята, у меня есть столбец Nvarchar (50), который я использую в качестве столбца типа даты, потому что я использую персидский календарь, теперь я хочу выбрать время из двух разных времен, например, покажите мне данные между 2012/12/18 и 20/12/2012 как я могу это сделать, пожалуйста, помогите, и, кстати, я хочу использовать хранимые процедуры для этих действий, я пытаюсь это сделать, но это ничего не возвращает

ALTER proc [dbo].[sel_monthReport] @fdate nvarchar(50),@sdate nvarchar(50),@para   nvarchar(50)
as
begin
declare  @parametr nvarchar(50)
set @parametr=@para
select * from main where @parametr>=@fdate and @parametr <=@sdate
end

person amirtutunchi    schedule 05.02.2014    source источник
comment
Выбор типа данных на основе того, как пользователи хотят просматривать данные, редко бывает хорошей идеей. Было бы лучше использовать datetime в базе данных и конвертировать в/из персидского языка во внешнем интерфейсе.   -  person Damien_The_Unbeliever    schedule 05.02.2014
comment
Ух ты интересно en.wikipedia.org/wiki/Iranian_calendars и в стеке майкрософта есть конвертер msdn.microsoft.com/en-us/library/   -  person Ruskin    schedule 05.02.2014


Ответы (2)


Допустим, у вас есть столбец в таблице main с именем RecordDate, и этот столбец имеет тип nvarchar с датой в формате гггг/мм/дд.

В этом случае вам не нужен параметр @para в вашей хранимой процедуре. Измените его на что-то вроде этого:

ALTER PROC [dbo].[Sel_monthreport] @fdate NVARCHAR(50), 
                                   @sdate NVARCHAR(50) 
AS 
  BEGIN 
      SELECT * 
      FROM   main 
      WHERE  main.recorddate BETWEEN @fdate AND @sdate 
  END 

Обратите внимание, что это сравнение NVARCHAR, и оно работает только потому, что ваши даты хранятся в формате гггг/мм/дд. В целом, лучшим подходом было бы сравнение типов данных DATETIME (более высокая производительность и меньшее количество ошибок).

Вы можете преобразовать значение NVARCHAR в тип данных DATETIME с помощью функции CONVERT: http://msdn.microsoft.com/en-us/library/ms187928.aspx

person Dan    schedule 05.02.2014
comment
он не выдает никакой ошибки, но также ничего не показывает, результат равен 0 - person amirtutunchi; 05.02.2014
comment
какие значения вы вводите в параметры @fdate и @sdate? Каковы значения вашего столбца RecordDate? Работает ли это, если вы выполняете оператор SELECT напрямую, например SELECT * FROM main WHERE main.RecordDate BETWEEN '2012/12/18' AND '2012/12/20'? - person Dan; 05.02.2014
comment
см. все значения, которые я ввожу, это дата в формате гггг/мм/дд, и она работает для конкретной даты, например, 2012/12/18, но она не работает в течение периода времени, подобного тому, что я сказал выше, пожалуйста, помогите мне - person amirtutunchi; 05.02.2014
comment
Теперь это работает, вы были правы, когда я вставляю свои данные, я должен добавить ноль к дате, которая меньше 10, например, кроме 2012/12/8, кстати, я должен ввести 2012/12/08, спасибо - person amirtutunchi; 09.02.2014

Подобный вопрос уже задавали на StackOverflow. Как вы заметили, SQL Server по умолчанию не поддерживает персидский язык. В примерах ссылок на этот ответ (Как преобразовать дату и время на персидском языке в SQL Server), дата хранится в базе данных в формате даты SQL Server, но преобразуется вперед/назад в персидский формат даты. Вы можете расширить эти примеры UDF, чтобы они были в формате даты и времени.

Другой альтернативой было бы написать функцию даты/времени CLR, чтобы сделать то же самое. На CodeProject есть пример. В любом случае, вероятно, не лучше хранить даты в SQL Server в текстовом формате.

person CJBS    schedule 05.02.2014