【问题标题】:Column Set to 0 Instead of Date Stored Procedure列设置为 0 而不是日期存储过程
【发布时间】:2015-05-29 15:00:07
【问题描述】:

我试图在存储过程中将一列设置为当前日期(格式为 dd/mm/yyyy),但是该列只是设置为 0。代码如下:

USE [DBDataOne]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

declare @dateone varchar(max)
declare @dodate varchar(max)

select @dateone=convert(varchar,GETDATE(),103 )

select @dodate='Update [dbo].[tabfget] set DATEIN='+@dateone

exec (@dodate)

【问题讨论】:

  • 你的tabfget桌子是怎么设计的?
  • 没有引号它可能评估为整数除法。我不记得 103 格式是什么样子了……好吧,月份除以天除以年肯定会为零。

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

如果datein 被正确存储(作为日期/时间),那么您无需担心转换问题。

此外,您不需要为此使用动态 SQL。只是:

Update [dbo].[tabfget]
    set DATEIN = cast(getdate() as date);

如果-- 可怕的-- 您将日期存储为字符串 而不是正确的格式,那么您应该修复数据库。如果这是不可能的,你可以这样做:

Update [dbo].[tabfget]
    set DATEIN = convert(varchar(10), GETDATE(), 103);

但是,如果日期必须存储为字符串,那么您应该始终使用 ISO 标准格式,例如 YYYY-MM-DD。

【讨论】:

  • 谢谢戈登!你有什么方法可以包含斜杠 / 而不是破折号 - ?
  • @KieraSmith 。 . .可能有一种格式。或者,只需使用replace()
【解决方案2】:

为什么不能直接点赞

Update [dbo].[tabfget] set DATEIN = @dateone

(或)

Update [dbo].[tabfget] set DATEIN = convert(varchar,GETDATE(),103 )

是的,103 的格式/样式应该让你得到 / 而不是 - 喜欢

select GETDATE()

将导致2015-05-29 20:43:38.547

select CONVERT(varchar(15), GETDATE(), 103)

将导致29/05/2015

【讨论】:

  • 谢谢拉胡尔!你有什么方法可以包含斜杠 / 而不是破折号 - ?
【解决方案3】:

试试这个:

declare @dateone varchar(max)
declare @dodate varchar(max)

select @dateone=convert(varchar,GETDATE(),103 )

select @dodate='Update [dbo].[tabfget] set DATEIN='+quotename(@dateone,char(39));

Exec(@dodate);

【讨论】:

  • 这里的问题是您没有解决 OP 发布的所有主要实现问题。 varchar(max) 对于日期的字符串表示是荒谬的,这里对动态 sql 的需求绝对为零。这应该只是一个简单的更新语句。
  • 是的,你可以做到,没有动态 SQL 显然,这就是为什么我认为他可能想要更复杂的语句。
  • 引用问题实际上是其他人没有指出的问题,并且与任何错误一样严重。
【解决方案4】:

您绝对应该在没有动态 sql 的情况下进行更新。但是零的原因是您没有将日期引用为文字,而是将其评估为整数除法。 (格式 103 为 mm/dd/yyyy。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2019-05-23
    • 2021-03-04
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多