【问题标题】:Change only time part of a datetimeoffset in SQL仅更改 SQL 中 datetimeoffset 的时间部分
【发布时间】:2014-01-13 12:38:10
【问题描述】:

如何只设置 SQL datetimeoffset 变量的时间部分?

例如:

DECLARE @date datetimeoffset = '2014-01-11 11:04:26 +02:00'

我想再计算两个日期时间偏移:

@startdate should be '2014-01-11 00:00:00 +02:00'
@enddate should be '2014-01-12 00:00:00 +02:00'

但我尝试的所有解决方案都将偏移量设置为零。

注意:我需要结果中的原始偏移量,因为我需要将它们与表中的某些 datetimeoffset 列进行比较。所以仅仅投射到一个日期是行不通的。

补充说明:这在 SQL2012 中会很容易;我可以使用 DATETIMEOFFSETFROMPARTS。不幸的是,我目前无法升级到 2012。示例:

SET @startdate = SELECT DATETIMEOFFSETFROMPARTS(datepart(yyyy, @date), datepart(mm, @date), datepart(dd, @date), 0, 0, 0, 0, datepart(tz, @date), 0, 7);

【问题讨论】:

  • 如果要删除时间部分,请使用cast(@startdate as date)。
  • 你能清楚地写出你试图执行的代码和你期望的确切结果吗?

标签: sql-server sql-server-2008 tsql datetimeoffset


【解决方案1】:
DECLARE @date DATETIMEOFFSET = '2014-01-11 11:04:26 +02:00'

SELECT TODATETIMEOFFSET(CAST(@date AS date),DATEPART(tz,@date))
SELECT TODATETIMEOFFSET(DATEADD(day,1,CAST(@date AS date)),DATEPART(tz,@date))

【讨论】:

    【解决方案2】:
    DECLARE @date DATETIMEOFFSET = '2014-01-11 11:04:26 +02:00'
    
    SELECT @date InputDate,
    CONVERT(DATETIMEOFFSET,(CONVERT(VARCHAR(20),CONVERT(DATETIME,(CONVERT(DATETIME,CONVERT(DATE,@date)))) ) + ' ' + RIGHT(@date,6))) StartDate,
    CONVERT(DATETIMEOFFSET,(CONVERT(VARCHAR(20),CONVERT(DATETIME,(CONVERT(DATETIME,CONVERT(DATE,DATEADD(day,1,@date))))) ) + ' ' + RIGHT(@date,6))) EndDate
    

    【讨论】:

    • 谢谢你,这很好用。你介意再解释一下吗?它似乎从输入日期的各个部分拼凑出一个字符串。
    • 好的。 CONVERT(VARCHAR(20),(CONVERT(DATETIME,CONVERT(DATE,@date))) 以上部分用于从输入中获取日期并将其转换为日期时间,因此此处的显式转换使时间为 00:00.00
    • 2.这里我使用字符串函数(右函数)从输入中获取偏移值,因为 datefunction 对 Timeoffset 有一些限制
    猜你喜欢
    • 2018-07-23
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多