SQL Server getdate()到类似“2009-12-20”的字符串

时间:2009-12-20 21:23:23

标签: sql sql-server tsql

在Microsoft SQL Server 2005和.NET 2.0中,我想将当前日期转换为此格式的字符串:“YYYY-MM-DD”。例如,2009年12月12日将成为“2009-12-20”。我如何在SQL中执行此操作。

表定义中此SQL语句的上下文。换句话说,这是默认值。因此,当创建新记录时,当前日期的默认值将以上述格式存储为字符串。

我正在尝试: SELECT CONVERT(VARCHAR(10),GETDATE(),102)AS [YYYY.MM.DD]

但SQL服务器一直将其转换为: ('SELECT CONVERT(VARCHAR(10),GETDATE(),102)AS [YYYY.MM.DD]')

所以结果就是:

'SELECT CONVERT(VARCHAR(10),GETDATE(),102)AS [YYYY.MM.DD]'

以下是Visual Studio服务器资源管理器,表,表定义,属性显示内容的屏幕截图:

alt text

这些包装器位正在自动添加并将其全部转换为文字字符串:(N'')

这就是我尝试使用我之前使用的基本DATETIME之外的其他原因的原因:

这是我将所有内容挂钩到ASP.NET GridView并尝试通过网格视图进行更新时出现的错误:

'/'应用程序中的服务器错误。

正在使用的SQL Server版本不支持数据类型“date”。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:正在使用的SQL Server版本不支持数据类型“date”。

来源错误:

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

堆栈追踪:

[ArgumentException:正在使用的SQL Server版本不支持数据类型'date'。]

注意:我添加了一个相关问题,试图绕过SQL Server in use does not support datatype 'date' error,以便我可以按照建议使用DATETIME。

3 个答案:

答案 0 :(得分:11)

http://www.sql-server-helper.com/tips/date-formats.aspx

有关所有日期时间格式的列表。

答案 1 :(得分:7)

CONVERT(CHAR(10), MyDateValue, 120)

但是,为什么不将日期存储为,呃,“日期”或“smalldatetime”? 并使用GETDATE()作为默认值

正确行事的理由

  • 由于数据类型优先级而导致的隐式转换
  • 语言相关(不提ISO:SQL Server不适用于仅限日期ISO 2008)
  • 要存储的10个字节,或者作为varchar的12个字节。如果需要时间(smalldatetime为4),则更糟糕

编辑:

您不使用SELECT作为默认值。您使用函数或常量。

来自CREATE TABLE...DEFAULT constant_expression...

所以将CONVERT包装在UDF中。或者使用GETDATE()。

你为什么要使用102风格?

答案 2 :(得分:4)

如果您真的必须将您的日期存储为VARCHAR(实际上没有充分理由......),那么您必须在表定义中对此进行定义:

CREATE TABLE yourTable
(........,
 TimestampString NVARCHAR(50) DEFAULT CONVERT(VARCHAR(50), GETDATE(), 102),
 ..........)

AS [YYYY.MM.DD]部分放在你的陈述中,你应该没事。

并请:日期字符串永远不会需要1024个字符!只要他们确实需要,就制作NVARCHAR字段....

但严重的是:我会总是将日期存储为DATETIME字段 - 如果您绝对需要字符串表示,为什么不为此添加计算字段:

ALTER TABLE YourTable
  ADD TimestampString AS CONVERT(NVARCHAR(50), YourDateField, 102) PERSISTED

这样,您将获得一个新的计算字段“TimestampString”,它始终表示DATETIME字段的102样式VARCHAR表示,然后您可以在DATETIME字段上进行所有日期计算。