在 SQL Server 中,我有一个 varchar 列,其值例如:
07/May/2012:00:06:22
07/May/2012:00:06:22
07/May/2012:00:06:22
07/May/2012:00:06:22
07/May/2012:00:06:22
Run Code Online (Sandbox Code Playgroud)
我需要取一DATETIME列 ( Column A) 只包含一个日期,然后添加一VARCHAR(5)列 ( Column B),其中包含一个时间的 24 小时表示形式(即1330),并将它们组合起来以获得DATETIME可在DATEDIFF命令中使用的有效值。
例如,Column Acontains2013-07-01 00:00:00.000和Column Bcontains 1330。结果应该是2013-07-01 13:30:00.000。
编辑:只是为了澄清事情,这是一个以这种方式存储数据的现有数据库,完全改变事物的工作方式以使其以适当的方式存储数据超出了我的项目范围。如果可以,我会,但我不能,所以我被多列困住了。此外,B 列中的数据将始终为 4 位时间,因为输入页面会进行检查以确保时间是有效的军事时间格式。
在存储事件的表中,日期和时间是两个单独的列:
CREATE TABLE events (
pk int serial,
detail text,
ev_date date,
ev time without time zone
);
Run Code Online (Sandbox Code Playgroud)
如果我过滤日期:
ev_date BETWEEN start_date::date AND end_date::date AND
ev_time BETWEEN start_date::time AND end_date::time
Run Code Online (Sandbox Code Playgroud)
我错过了每天时间范围之外发生的两个日期内的所有事件。
因此,开始时间仅与开始日期相关,与结束日期相同。
有人对如何有效地处理数百万个事件提出建议吗?
如何以毫秒为单位获取当前时间以及如何在 mySql 中添加 5 分钟
作为 Postgres 的新手用户,ad我的 PostgreSQL 9.5 (x64) 数据库中有一个 87 行的表。除了其他列之外,它还有两列“开始”和“结束”,其日期时间范围如下:
ID Start End
1 2003-06-07 00:00:00 2004-09-30 23:59:59
Run Code Online (Sandbox Code Playgroud)
我需要将范围拆分为存储在数据库中的单独行(从开始年份到间隔的最后一年)中的一年窗口,如下所示:
ID Start
1_2003 2003-06-07 00:00:00 2003-12-31 23:59:59
1_2004 2004-01-01 00:00:00 2004-09-30 23:59:59
Run Code Online (Sandbox Code Playgroud)
使用运算符||'_'||和Extract()函数,我可以将 ID 与年份连接起来。此外,这个问题解决了如何分割的间隔周,这个节目怎么好几天做相同的,但他们没有解决如何在专门年分裂的间隔。
我避免了这个问题,因为我不想采用基于存储过程的方法。我知道generate_series()从开始和停止参数返回一个系列,但实际上我正在努力打破一年的最后一天的间隔,然后从下一行的第一天重新开始。如果有人能指导我做到这一点,我将不胜感激?
我想在特定时间段内生成一系列月份。
我试过了:
select GENERATE_SERIES( '06/25/2016'::DATE, '12/15/2016'::DATE, '1 month' )
Run Code Online (Sandbox Code Playgroud)
它返回:
select GENERATE_SERIES( '06/25/2016'::DATE, '12/15/2016'::DATE, '1 month' )
Run Code Online (Sandbox Code Playgroud)
结束日期有问题。我想要的结果如下:
"generate_series"
"2016-06-25 00:00:00-06"
"2016-07-25 00:00:00-06"
"2016-08-25 00:00:00-06"
"2016-09-25 00:00:00-06"
"2016-10-25 00:00:00-06"
"2016-11-25 00:00:00-07"
Run Code Online (Sandbox Code Playgroud)
我正在使用 PostgreSQL。
在学习如何从前一周(例如从前一周的星期一的日期)获取星期几的日期时,我发现以下两个表达式很常见,您可以在其中更改最后一个数字(例如 0=星期一)取决于您想要的那一天:
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)
SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)
2017-05-29当我今天(2017-06-17)运行它时,两者似乎都返回了正确的日期。
我的问题是 - 这是如何工作的?似乎是在数周后6或7数周后1900-01-01?为什么它同时适用于 a6和7?
此外,是否存在需要注意的边缘情况,它可能无法提供预期结果?
因此,我们的数据团队寻求帮助以解决他们遇到的问题。我最终将其追踪到了一些真正超出范围的数据 (1/1/0001) 和他们使用的 DATEDIFF 函数。虽然我已经解决了他们的问题,但实际上我并不知道 0 在他们使用时会变成什么。
我最初认为它更接近整数溢出而不是真正的转换错误,但事实并非如此。我在带有 DATEDIFF_BIG 和相同错误的 SQL 2016 框中尝试了它。我有一个样本供你们在下面一起玩,以及哪些有效,哪些无效。
/** Setup The Sample */
DECLARE @TestValue DATETIME2(7)
SET @TestValue = '0001-01-01 10:30:00.0000000'
/** Conversion Error
Msg 242, Level 16, State 3, Line 10
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
*/
SELECT DATEDIFF(MINUTE, 0, @TestValue)
--Also does not work, same error.
SELECT DATEDIFF_BIG(MINUTE, 0, @TestValue)
/** Works */
SELECT DATEDIFF(MINUTE, '1/1/1900', @TestValue)
/** Works */
SELECT …Run Code Online (Sandbox Code Playgroud) 今天我面临着一个我无法解决的问题。
我需要检查两个日期时间(2019-04-08 13:30:00- 2019-04-08 15:30:00)的之间或重叠两个人(2019-04-08 14:00:00- 2019-04-08 16:00)。
想象这些日期时间是事件的日期。我们可以看到之间有一个事件14:00,16:00所以我们不能有其他事件。
我试过这样的事情:
SELECT * FROM Rezerwacja WHERE
(('2019-04-08 13:30:00.000' between Start and Stop) OR
('2019-04-08 15:30:00.000' between Start and Stop))
Run Code Online (Sandbox Code Playgroud)
如何检查是否已经有“事件”?
在其中一个存储过程中,我需要捕获实时事件的持续时间。保证永远不会超过 24 小时,因此结果列的数据类型选择为TIME(3)(映射到TimeSpan应用程序端)。计算过程如下:
update tbEvent set tWait= @dtEvent - dEvent - tEvent [where idEvent = @idEvent]
Run Code Online (Sandbox Code Playgroud)
此处dEvent和tEvent先前设置为dtEvent(原始事件@dtEvent的时刻)的日期和时间部分,并且是后续关闭事件的时刻。因此,我从 DATETIME 变量中减去 DATE 和 TIME 列值,并将结果填充到 TIME 列中。
[合理吗?] 预期行为: SQL 将每个表达式项隐式转换为 DATETIME,执行减法,然后通过简单地删除 DATE 部分将结果隐式转换为 TIME。 这一直有效! 嗯, - 到目前为止..
一个更新脚本突然在 SQL 2016 (13.0.1742.0) 上产生了一个错误:
System.Data.SqlClient.SqlException (0x80131904):
The data types datetime and date are incompatible in the subtract operator.
Error Number:402,State:1,Class:16
Run Code Online (Sandbox Code Playgroud)
但是相同的脚本在 2008 R2 (10.50.2500.0) 和 2019 (15.0.2080.9) 上运行良好! …