【问题标题】:Date format value not updating from previous format to new format after update更新后日期格式值未从以前的格式更新为新格式
【发布时间】:2020-09-30 12:17:56
【问题描述】:

当我将日期格式为 MMM DD,YYYY 的表中的列更新为新格式时。格式不会更改为所需的格式,即 YYYY-MM-DD HH:MM:SS。即使更新不同的值,如GETDATE()。日期将更改,但格式将保持不变。

类型为 varchar 的列中的当前值和格式

截止日期

2020 年 6 月 27 日上午 12:00


所需格式 截止日期

2020-06-27 00:00:00.000


更新声明

update TableName
  set  
  DueDate =  CAST([DueDate] AS smalldatetime),     
  LastSyncDateTime = GETDATE()
where CaseGuid =  'DA2CE6A1-0394-463E-8E8D-962F3A24ADC8' 

【问题讨论】:

  • 感谢@DaleK,是否无法将现有记录更新为新的日期格式?就像描述中提到的那样。
  • @DaleK 不,我可以以任何我想要的格式读取日期。但在这种情况下,我想将现有记录更新为不同的格式。
  • 嗨@DaleK。 “日期不以格式存储”是不正确的。事实上,日期与任何其他数据类型一样具有格式。甚至 INT 在磁盘上都有格式。我强烈推荐给read this post as example on what is the exact format of DATETIME2 on the disk(这个高级帖子级别 500 内部)。
  • 晚安@Menzi,您似乎对日期显示格式和日期存储格式感到困惑。我有一篇关于这个主题的帖子,名称为“日期显示格式与日期存储格式”。简短的解释是,您提到的只是客户端显示格式,而 SQL Server 具有用于存储日期的特定格式。您可以使用不同的样式将日期插入到表中,并使用不同的样式在客户端显示它,但从“SQL Server 的角度”来看,它将始终以相同的方式存储。
  • @Menzi,为了解决您的原始需求,您只需向服务器提供有关您在客户端(在查询中)使用的样式的信息。这是通过使用带有第三个参数即样式的显式转换来完成的。例如,如果您使用 dd/MM/yyyy 等客户端以色列格式,则使用 CONVERT(DATE, '27/02/2021', 103)。有关不同风格的更多信息,您可以查看this documentation

标签: sql sql-server tsql date datetime


【解决方案1】:

“日期显示格式”和“日期存储格式”之间存在巨大的混淆。非常简短的解释是,您提到的只是客户端 显示 格式,而 SQL Server 具有用于存储日期的特定格式(请记住,服务器仅存储零和一)。

您可以使用不同的样式将日期插入到表格中(显示格式的正式名称是STYLE),您可以在客户端使用不同的样式显示日期,但它始终从“ SQL Server 观点”根据使用的 DATE 类型。

为了解决您最初的需求,您需要做的就是向服务器提供有关您在客户端(在查询中)使用的样式的信息。这是通过使用带有第三个参数的显式 CONVERT 来完成的,即 STYLE。

例如,如果您在客户端使用 dd/MM/yyyy 等以色列格式,则应使用 CONVERT(DATE, '27/02/2021', 103)

有关不同风格的更多信息,您可以查看documentation

注意:如果您想以现有样式未涵盖的特定格式显示日期,则可以在查询中使用函数 FORMAT()。此功能非常灵活,可以以您的特定格式返回数据。请记住,此函数将数据作为字符串返回,并且不再是日期。

例如,假设我要使用以下格式:“日:日,月:月,年:年”。因此,如果日期是“27/02/2021”,那么我希望得到“Day:27,Month:02,Year:2021”。在这种情况下使用以下:

DECLARE @D DATE
SET @D = CONVERT(DATE, '27/02/2021', 103) -- convert string to date for storing 
select FORMAT(@D, 'Day:dd, Month:MM, Year:yyyy') -- convert date to string for displaying

【讨论】:

    【解决方案2】:

    解决方案使用格式化函数

    update TableName
      set  
      DueDate =  FORMAT (CAST([DueDate] AS smalldatetime),'yyyy-MM-dd HH:mm:ss'),
      LastSyncDateTime = GETDATE()
      where CaseGuid =  'DA2CE6A1-0394-463E-8E8D-962F3A24ADC8' 
    

    https://www.sqlshack.com/a-comprehensive-guide-to-the-sql-format-function/

    【讨论】:

    • DueDate的数据类型是什么?这对于了解这里发生的事情至关重要。如果DueDatevarchar,你需要停止你现在正在做的事情,并将其更改为日期数据类型。不要将日期存储在字符串字段中。
    • 嗨@Menzi,在我个人看来,使用这个解决方案“FORMAT (CAST([DueDate] AS smalldatetime),'yyyy-MM-dd HH:mm:ss')”毫无意义,不推荐使用。 (1) FORMAT 是完全灵活的,正如我在示例中展示的那样,可能没有理由在 FORMAT 中使用 CAST,而您可以直接使用 FORMAT。 (2) 您要求的“yyyy-MM-dd HH:mm:ss”的样式被内置的 CONVERT 覆盖,因此,正如我所建议的,我认为您应该使用 CONVERT 而不是 FORMAT。顺便说一下,这种款式是120。检查我在答案中添加的链接以获取更多样式。
    • 根据更新后的问题[DueDate] 的类型为varchar,OP 只想更改列的格式。
    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多