在sql server中使用sql nvarchar(50)作为日期变量

时间:2014-02-05 08:13:26

标签: sql-server tsql date nvarchar

大家好我有Nvarchar(50)的列,我用它作为日期类型列,因为我现在使用波斯日历我想从两个不同的时间选择时间,例如显示我在2012/12之间的数据/ 18和2012/12/20我怎么能这样做请帮助,顺便说一下我想用这些动作的存储过程我尝试这个但它不会返回任何东西

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

2 个答案:

答案 0 :(得分:1)

假设您的main表中有一列名为RecordDate,此列的类型为nvarchar,日期格式为yyyy / mm / dd。

在这种情况下,您不需要存储过程中的@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比较,因为您的日期以yyyy / mm / dd格式存储,因此它才有效。通常,更好的方法是比较DATETIME数据类型(更好的性能和更少的错误)。

您可以使用CONVERT函数将NVARCHAR值转换为DATETIME数据类型:http://msdn.microsoft.com/en-us/library/ms187928.aspx

答案 1 :(得分:0)

之前在StackOverflow上提出过类似的问题。正如您所说,开箱即用,SQL Server不支持波斯语。在此答案(How to convert datetime in persian in sql server)上的链接示例中,日期作为SQL Server日期格式存储在数据库中,但转换回/转换为波斯日期格式。您可以将这些UDF示例扩展为日期时间格式。

另一种选择是写一个CLR日期/时间函数来做同样的事情。有一个example on CodeProject。无论哪种方式,最好将SQL Server中的日期存储为文本格式。