Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何在T-SQL中将波斯语(shamsi)日期转换为公历?_Tsql_Date_Date Conversion - Fatal编程技术网

Tsql 如何在T-SQL中将波斯语(shamsi)日期转换为公历?

Tsql 如何在T-SQL中将波斯语(shamsi)日期转换为公历?,tsql,date,date-conversion,Tsql,Date,Date Conversion,我使用数据库中存储的大量数据制作报告,我想知道在选择表时是否有一种快速的方法将表中的所有日期转换为波斯日期 有一些转换方法,但它们不是基于SQL的,因此它们比SQL中的函数要慢 因此,如果有人知道如何在SQL中进行转换,我将非常感谢他 经过一天的搜索,我决定用自己的方式解决问题 结果是:享受:D 使用[测试] 去 /******对象:UserDefinedFunction[dbo]。[MyG2J]脚本日期:2019年10月11日02:35:43ب******/ 将ANSI_空值设置为ON 去 在

我使用数据库中存储的大量数据制作报告,我想知道在选择表时是否有一种快速的方法将表中的所有日期转换为波斯日期

有一些转换方法,但它们不是基于SQL的,因此它们比SQL中的函数要慢


因此,如果有人知道如何在SQL中进行转换,我将非常感谢他

经过一天的搜索,我决定用自己的方式解决问题

结果是:享受:D

使用[测试]
去
/******对象:UserDefinedFunction[dbo]。[MyG2J]脚本日期:2019年10月11日02:35:43ب******/
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
ALTER函数[dbo].[MyG2J](@inputDate-DateTime)
返回nvarchar(最大值)
开始
声明@mDay int、@mMonth int、@mYear int、@sDay int、@sMonth int、@sYear int、@mid int、@isMC bit=0、@isSC bit=0、@preSC bit=0;
设置@mDay=day(@inputDate);
设置@MONTH=MONTH(@inputDate);
设置@mYear=YEAR(@inputDate);
如果@mYear%4=0
设置@isMC=1;
其他的
设置@isMC=0;
set@sYear=@mYear-622;
如果(@sYear+1)%4=0
设置@preSC=1;
其他的
设置@preSC=0;
选择@mid=
案例
当@mMonth=1时,则为'20'
当@mMonth=2时,则为'19'
当@mMonth=3时,则为'20'
当@mMonth=4时,则为'20'
当@mMonth=5时,则为'21'
当@mMonth=6时,则为'21'
当@mMonth=7时,则为'22'
当@mMonth=8时,则为'22'
当@mMonth=9时,则为'22'
当@mMonth=10时,则为'22'
当@mMonth=11时,则为'21'
当@mMonth=12时,则为'21'
结束
如果@isMC=1
开始
设置为@mid=@mid-1
结束
如果@mmoth=3且@mDay=@mid
设置@sMonth=@mMonth+9;
其他的
开始
如果(@mMonth=3和@mDay>@mid)或(@mMonth>3)
开始
设置@sYear=@sYear+1;
设置为@sMonth=@mMonth-3;
结束
其他的
设置@sMonth=@mMonth+9;
结束
如果(@sYear+1)%4=0
设置@isSC=1;
其他的
设置@isSC=0;
如果@isMC=1
开始
如果@isSC=0
如果@ammonth=3.
设置@mid=@mid+1
结束
其他的
开始
如果@isSC=1
如果@ammonth=3.
设置为@mid=@mid-1
结束
如果@mDay>@mid
开始
设置@sDay=@mDay-@mid;
设置@sMonth=@sMonth+1;
结束
其他的
开始

if@smonthip:始终为字符串数据类型指定长度。默认长度取决于用法:“当数据定义或变量声明语句中未指定n时,默认长度为1。当未使用CAST函数指定n时,默认长度为30。”。
@mid
声明为
int
,但您似乎决定给它分配一个字符串值:
选择@mid=case当@mmoth=1时,然后选择'20'…
。值
20
将起作用,无需使用字符串
'20'
并强制数据库将其转换为
int
如果@isSC=0如果@mmoth=3如果@isSC=0和@mMonth!=3套@中间+=1。您还可以通过使用单个
select
语句为多个变量赋值,而不是使用多个
set
语句,来删除一些
begin
/
end
块。虽然这可能不会提高清晰度,但您可以结合
案例
条件,例如,
当@mm在(1、3、4)中时,然后是20
。感谢您的提示和评论