日期格式值未在更新后从以前的格式更新为新格式

时间:2020-06-10 23:00:01

标签: sql sql-server tsql date datetime

当我将日期格式为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' 

2 个答案:

答案 0 :(得分:1)

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

您可以使用不同的样式将日期插入表中(显示格式的正式名称为STYLE),并且可以使用不同的样式在客户端显示日期,但始终会与“ SQL Server的观点”,取决于所使用的DATE类型。

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

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

有关不同样式的更多信息,请选中此documentation

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

例如,假设我要使用以下格式:“ Day:dd,Month:MM,Year:yyyy”。因此,如果日期是“ 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

答案 1 :(得分:0)

解决方案使用格式功能

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/