使用转换日期的问题 [英] Problem using Convert on dates

查看:59
本文介绍了使用转换日期的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用Convert的存储过程,其中完全相同的Convert

字符串在过程的SELECT部分​​中起作用,但在

WHERE部分中失败。

整个SP列在下面。

具体来说,我在WHERE子句中对此部分有疑问:


DATEADD(Day, tblMyEventTableName.ReminderDays,@ DateNow)

CONVERT(smalldatetime,str(DATEPART(月,@ DateNow)+1)+''/''+

str(DATEPART (Day,tblMyEventTableName.TaskDateTime))+''/''+

str(DATEPART(年,@ DateNow)),101)和

tblMyEventTableName.RecurrenceEnd)


(tblMyEventTableName.ReminderDays =用户希望提前几天

提醒)


如果我使用DATEPART(月,@ DateNow)+1

即使我在SELECT部分​​使用它也会失败。错误

mesage是将char数据类型转换为smalldatetime数据类型

导致超出范围的smalldatetime值。

如果我使用DATEPART(月,@ DateNow)

它不会失败。

如果我使用DATEPART(月,@ DateNow)+2

它不会失败。

如果我使用DATEPART(月,@ DateNow)+3

它会失败,并显示错误消息转换数据时出错键入datetime to

smalldatetime。

如果我使用DATEPART(月,@ DateNow)+4

它不会失败。


SP尝试做的是评估

个人提醒表中的一系列日期。如果用户将提醒设置为

month,则SP会评估当月的日期是否已经过了今天的日期,这样,它会在下个月的某一天创建一个提示日期(myReminderDate)和



(RecurrenceEnd是提醒设置为停止的日期):

更改程序SPExample

@DateNow smalldatetime

As

SELECT

CASE WHEN tblMyEventTableName。 RecurrencePattern =''month''AND

DATEPART(d,@ DateNow)< = DATEPART(d,tblMyEventTableName.TaskDateTime)

和tblMyEventTableName.RecurrenceEnd> @DateNow


/ *每月活动:今天小于或等于每月任务

月 - 所以提醒本月* /


THEN CONVERT(smalldatetime,str(DATEPART(月,@ DateNow))+''/''+

str(DATEPART(Day,tblMyEventTableName.TaskDateTime)) +''/''+

str(DATEPART(年,@ DateNow)),101)ELSE

CASE WHEN tblMyEventTableName.RecurrencePattern =''month''AND

DATEPART(d,@ DateNow)> DATEPART(d,tblMyEventTableName.TaskDateTime)

和tblMyEventTableName.RecurrenceEnd> @DateNow


/ *每月活动:今天的日期大于每月的任务月日所以

下个月提醒* /

THEN CONVERT(smalldatetime,str(DATEPART(月,@ DateNow)+1)+''/''

+ str(DATEPART(Day,tblMyEventTableName.TaskDateTime))+' '/''+

str(DATEPART(年,@ DateNow)),101)ELSE


/ * RecurrencePattern未设置为每月只需使用提醒

date * /

tblMyEventTableName.TaskDateTime

END

END

AS myReminderDate,tblMyEventTableName.myTaskName

FROM

tblMyEventTableName

WHERE


/ *照顾每月活动等于或等于今日

年* /


tblMyEventTableName.RecurrencePattern =''每月''

AND

DATEPART(d,@ DateNow)< = DATEPART(d,tblMyEventTableName.TaskDateTime)

AND

tblMyEventTableName.Recurre nceEnd> @DateNow

AND

DATEADD(Day,tblMyEventTableName.ReminderDays,@ DateNow)之间

CONVERT(smalldatetime,str(DATEPART(月,@) DateNow))+''/''+

str(DATEPART(Day,tblMyEventTableName.TaskDateTime))+''/''+

str(DATEPART(年, @DateNow)),101)和

tblMyEventTableName.RecurrenceEnd)




/ *负责每月的活动在今天的一年之前* /


tblMyEventTableName.RecurrencePattern =''每月''

AND

DATEPART( d,@ DateNow)> DATEPART(d,tblMyEventTableName.TaskDateTime)

AND

tblMyEventTableName.RecurrenceEnd> @DateNow

AND

DATEADD(Day,tblMyEventTableName.ReminderDays,@ DateNow)之间

CONVERT(smalldatetime,str(DATEPART(月,@) DateNow)+1)+''/''+

str(DATEPART(Day,tblMyEventTableName.TaskDateTime))+''/''+

str(DATEPART(年,@ DateNow)),101)和

tblMyEventTableName.RecurrenceEnd)

I have a stored procedure using Convert where the exact same Convert
string works in the SELECT portion of the procedure but fails in the
WHERE portion.
The entire SP is listed below.
Specifically, I have a problem with this portion in the WHERE clause:

DATEADD(Day,tblMyEventTableName.ReminderDays, @DateNow) Between
CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) AND
tblMyEventTableName.RecurrenceEnd)

(tblMyEventTableName.ReminderDays = days ahead the user wants to be
reminded)

If I use DATEPART(Month, @DateNow)+1
it fails even though I use this in the SELECT portion. The error
mesage is "The conversion of char data type to smalldatetime data type
resulted in an out-of range smalldatetime value."
If I use DATEPART(Month, @DateNow)
it doesn''t fail.
If I use DATEPART(Month, @DateNow)+2
it doesn''t fail.
If I use DATEPART(Month, @DateNow)+3
it fails with error message "Error converting data type datetime to
smalldatetime."
If I use DATEPART(Month, @DateNow)+4
it doesn''t fail.

What the SP is trying to do is to evaluate a series of dates in a
table of personal reminders. If the user has set the reminder to
"monthly", the SP evaluates if the day of the month has already passed
today''s date, it so, it creates a reminder date (myReminderDate) with
next month''s day of the month.
(RecurrenceEnd is the date the reminder is set to stop):
Alter Procedure SPExample
@DateNow smalldatetime
As
SELECT
CASE WHEN tblMyEventTableName.RecurrencePattern =''monthly'' AND
DATEPART(d, @DateNow) <= DATEPART(d,tblMyEventTableName.TaskDateTime)
and tblMyEventTableName.RecurrenceEnd > @DateNow

/*monthly event: today day is less than or equal to than monthly task
month-day so remind this month*/

THEN CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) ELSE
CASE WHEN tblMyEventTableName.RecurrencePattern =''monthly'' AND
DATEPART(d, @DateNow) > DATEPART(d,tblMyEventTableName.TaskDateTime)
and tblMyEventTableName.RecurrenceEnd > @DateNow

/*monthly event: today day is greater than monthly task month-day so
remind next month*/

THEN CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1) + ''/''
+ str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) ELSE

/*RecurrencePattern is not set to monthly so just use the reminder
date*/
tblMyEventTableName.TaskDateTime
END
END
AS myReminderDate, tblMyEventTableName.myTaskName
FROM
tblMyEventTableName
WHERE

/* takes care of monthly events that are after or equal today''s day of
year */

tblMyEventTableName.RecurrencePattern =''monthly''
AND
DATEPART(d, @DateNow) <= DATEPART(d,tblMyEventTableName.TaskDateTime)
AND
tblMyEventTableName.RecurrenceEnd > @DateNow
AND
DATEADD(Day,tblMyEventTableName.ReminderDays, @DateNow) Between
CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) AND
tblMyEventTableName.RecurrenceEnd)

OR
/* takes care of monthly events that are before today''s day of year */

tblMyEventTableName.RecurrencePattern =''monthly''
AND
DATEPART(d, @DateNow) > DATEPART(d,tblMyEventTableName.TaskDateTime)
AND
tblMyEventTableName.RecurrenceEnd > @DateNow
AND
DATEADD(Day,tblMyEventTableName.ReminderDays, @DateNow) Between
CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) AND
tblMyEventTableName.RecurrenceEnd)

推荐答案

Lauren Quantrell(la *** **********@hotmail.com)写道:
Lauren Quantrell (la*************@hotmail.com) writes:
我有一个使用Convert的存储过程,其中完全相同的Convert
字符串在过程的SELECT部分​​中起作用但在
WHERE部分失败。
整个SP列在下面。
具体来说,我在WHERE子句中对此部分有疑问:

DATEADD(天,tblMyEventTableName.ReminderDays,@ DateNow)
CONVERT(smalldatetime,str(DATEPART(月,@ DateNow)+1)+''/''+
str(DATEPART(Day,tblMyEventTableName.TaskDateTime) ))+ '/''+
str(DATEPART(年,@ DateNow)),101)和
tblMyEventTableName.RecurrenceEnd)
I have a stored procedure using Convert where the exact same Convert
string works in the SELECT portion of the procedure but fails in the
WHERE portion.
The entire SP is listed below.
Specifically, I have a problem with this portion in the WHERE clause:

DATEADD(Day,tblMyEventTableName.ReminderDays, @DateNow) Between
CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) AND
tblMyEventTableName.RecurrenceEnd)




您的整个程序有点太复杂了,不能鼓励我

潜入细节,至少不是没有表定义

和样本数据。


但是如果我理解了上述内容,那么如果

taskdatetime是例如20030131则无法工作,因为你将登陆

不存在的日期20030231。看来你需要优化你的

商业规则以涵盖这种情况。


另外,我不知道你的桌子有多大,但是如果blMyEventTableName.ReminderDays上有一个索引

,则上面的表达式将不会使用该索引,因为该列是表达式的一部分。

-

Erland Sommarskog,SQL Server MVP, so****@algonet.se


SQL Server SP3联机丛书
http://www.microsoft.com/sql/techinf...2000 /books.asp


Erland Sommarskog< so **** @ algonet.se>在消息新闻中写道:< Xn ********************* @ 127.0.0.1> ...
Erland Sommarskog <so****@algonet.se> wrote in message news:<Xn*********************@127.0.0.1>...
Lauren Quantrell(la *************@hotmail.com)写道:
Lauren Quantrell (la*************@hotmail.com) writes:
我有一个使用Convert的存储过程,其中完全相同的Convert
字符串在SELECT部分​​工作该过程但在
WHERE部分失败。
整个SP如下所示。
具体来说,我在WHERE子句中对此部分有疑问:
DATEADD(Day,tblMyEventTableName.ReminderDays,@ DateNow)之间
CONVERT(smalldatetime,str(DATEPART(月,@ DateNow)+1)+''/''+
str(DATEPART(Day, tblMyEventTableName.TaskDateTime))+''/''+
str(DATEPART(年,@ DateNow)),101)和
tblMyEventTableName.RecurrenceEnd)
I have a stored procedure using Convert where the exact same Convert
string works in the SELECT portion of the procedure but fails in the
WHERE portion.
The entire SP is listed below.
Specifically, I have a problem with this portion in the WHERE clause:

DATEADD(Day,tblMyEventTableName.ReminderDays, @DateNow) Between
CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1) + ''/'' +
str(DATEPART(Day, tblMyEventTableName.TaskDateTime)) + ''/'' +
str(DATEPART(Year, @DateNow)),101) AND
tblMyEventTableName.RecurrenceEnd)



你的整个过程有点太复杂了,不能鼓励我深入细节,至少不是没有表格定义和样本数据。

但是如果我理解了他正确地说,如果
taskdatetime是例如20030131,它将无效,因为你将登陆
不存在的日期20030231.看来你需要优化你的业务规则到盖住这个案子。

另外,我不知道你的桌子有多大,但是如果blMyEventTableName.ReminderDays上有一个索引
,上面的表达式将不会
使用该索引,因为该列是表达式的一部分。



Your entire procedure is a bit too complicated to encourage me to
dive into the details, at least not without the table definition
and sample data.

But if I understand the above correctly, it will not work if
taskdatetime is for instance 20030131, as you will land on the
non-existing date 20030231. It seems that you need to refine your
business rules to cover this case.

Also, I don''t know how big your table is, but if there is a index
on blMyEventTableName.ReminderDays, the expression above will not
use that index, since the column is part of an expression.



我认为以下条款不正确:


CONVERT(smalldatetime, str(DATEPART(月,@ DateNow)+1)


基本上你试图转换一个整数,即

月+ 1到一个smalldatetime 。我本来期望的是:


CONVERT(int,str(DATEPART(月,@ DateNow)+1)

- 例如

声明@DateNow smalldatetime

选择@DateNow =''31 -Dec-2003''


- 这会生成错误语法错误将字符串

转换为smalldatetime数据类型。

选择CONVERT(smalldatetime,str(DATEPART(月,@ DateNow)+1))

- 这个工作

选择CONVERT(int,str(DATEPART(月,@ DateNow)+1))


I think the following clause is not correct:

CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1)

Basically you are attempting to convert an integer number, ie the
month + 1 to a smalldatetime. I would have expected something like:

CONVERT(int,str(DATEPART(Month, @DateNow)+1)
-- For example
declare @DateNow smalldatetime
select @DateNow = ''31-Dec-2003''

-- This generates the error Syntax error converting character string
to smalldatetime data type.
select CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1))
-- This works
select CONVERT(int,str(DATEPART(Month, @DateNow)+1))


神秘人(Pr * ***********@hotmail.com)写道:
Mystery Man (Pr************@hotmail.com) writes:
我认为以下条款不正确:

CONVERT(smalldatetime,str(DATEPART) (月,@ DateNow)+1)
I think the following clause is not correct:

CONVERT(smalldatetime,str(DATEPART(Month, @DateNow)+1)




是的,脱离背景这是非常不正确的,因为有一个

右边的假设这是完整的表达,重新格式化

易读性:


CONVERT(smalldatetime,

str(DATEPART(月,@ DateNow)+ 1)+''/''+

str(DATEPART(Day,tblMyEventTableName.TaskDateTime))+''/''+

str(DATEPART(年,@ DateNow)),

101)


我和你做了同样的反思,但我试过QA看看它实际上会回报什么?b $ b。需要一段时间来掌握语法错误...


Anway,甚至完整的表达都不好,因为它没有

工作日期之类的2004-01-30。


-

Erland Sommarskog,SQL Server MVP, so **** @ algonet.se


SQL Server SP3联机丛书
http://www.microsoft.com/sql/techinf...2000/books.asp


这篇关于使用转换日期的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆