【问题标题】:SQL Server: convert ((int)year,(int)month,(int)day) to Datetime [duplicate]SQL Server:将((int)year,(int)month,(int)day)转换为日期时间[重复]
【发布时间】:2010-12-27 18:56:15
【问题描述】:

可能重复:
Create a date with T-SQL

我有一个数据表,将每年、月份和日期的值存储为整数:

year | month | day
2009 |   1   |  1 
2008 |  12   |  2
2007 |   5   |  5

我需要将它转换为日期时间值,因为我需要在操作之间的日期时间中使用它。我怎么能这样做?

【问题讨论】:

标签: sql-server datetime


【解决方案1】:
SELECT CAST(CAST(year AS varchar) + '/' + CAST(month AS varchar) + '/' + CAST(day as varchar) AS datetime) AS MyDateTime
FROM table

【讨论】:

  • 这是个坏主意 - 这取决于您的日期格式的本地设置。
  • @marc_s 理解,但根据您的部署需要,它可能是一个静音点。
  • 现在。如果它是一次性的临时查询,我可以理解您的观点。但不在存储过程中。 marc_s 有一个好点子!
【解决方案2】:

为了独立于语言和区域设置,您应该使用 ISO 8601 YYYYMMDD 格式 - 这适用于任何语言和区域设置有效的任何 SQL Server 系统:

SELECT
   CAST(
      CAST(year AS VARCHAR(4)) +
      RIGHT('0' + CAST(month AS VARCHAR(2)), 2) +
      RIGHT('0' + CAST(day AS VARCHAR(2)), 2) 
   AS DATETIME)

【讨论】:

  • YYYYMMDD 就像魔术一样!
  • @Fr0sT:我特别说这是针对SQL Server ...
  • @marc_s 将“MS SQL Server”称为“SQL Server”总是让我感到困惑。这就像说“智能手机”仅表示“iPhone”或“OS”仅表示“Windows”。
  • @Fr0sT: SQL Server 然而IS是官方产品名称!如果您想引用产品类别,请使用“数据库服务器”或“RDBMS”或类似的东西。 ....
  • @marc_s 是的,雷德蒙德的家伙有时在命名时“摇滚”......
【解决方案3】:

您可以将您的值转换为“十进制”日期时间,然后将其转换为真正的日期时间列:

select cast(rtrim(year *10000+ month *100+ day) as datetime) as Date from DateTable

请参阅here 了解更多信息。

【讨论】:

  • 这是最好的答案
【解决方案4】:

纯日期时间解决方案,不依赖于语言或 DATEFORMAT,无字符串

SELECT
    DATEADD(year, [year]-1900, DATEADD(month, [month]-1, DATEADD(day, [day]-1, 0)))
FROM
    dbo.Table

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多