我希望以下代码可以工作:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
var
FS: TFormatSettings;
const
DF = 'yyyymmdd';
begin
try
WriteLn(FormatDateTime(DF, Now));
FS := TFormatSettings.Create;
FS.ShortDateFormat := DF;
WriteLn(StrToDate('20121219', FS));
ReadLn;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
为什么会抛出异常,说"20121219"不是有效日期?这不正是通过TFormatSettings应该做的事情吗?
我的系统时区是UTC+3。
当我在 MySQL 中使用时间戳列时,它们是我的时区的输出。因此,如果时间戳列的 UTC 时间为 00:00,那么对我来说它会显示为 03:00。
我需要使用使用值填充时间戳列STR_TO_DATE。
例如我这样做:
INSERT INTO `dates`(`created`)
VALUES (STR_TO_DATE('2016-11-01 00:00:00', '%Y-%m-%d %H:%i:%s'))
Run Code Online (Sandbox Code Playgroud)
插入的值按原样显示:2016-11-01 00:00:00。
我的结论是:STR_TO_DATE认为其输入位于系统时区(UTC+3)内。
但我有 UTC 时区的日期时间字符串。我应该怎么办?该查询在 Liquibase 迁移中运行,因此我无法使用@@global.time_zone时区转换等变量。
我有一个varchar名为列的表birthday
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`birthday` varchar(30) COLLATE utf16_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_unicode_ci AUTO_INCREMENT=5 ;
INSERT INTO `test` (`id`, `birthday`)
VALUES (1, '20041225'),
(2, '2004-12-25'),
(3, '19941225'),
(4, '19941201');
Run Code Online (Sandbox Code Playgroud)
我尝试运行此查询:
SELECT str_to_date(birthday,"%Y%m%d")
FROM `test`
WHERE 1
Run Code Online (Sandbox Code Playgroud)
但它总是返回具有空值的行.
如果我运行查询:
SELECT str_to_date('20141225',"%Y%m%d")
FROM `test`
WHERE 1
Run Code Online (Sandbox Code Playgroud)
它会回来 2014-12-25
那我的查询有什么问题?
我想将我的日期格式从转换MMMM dd,yyyy为yyyy-MM-dd.
我尝试使用以下方法:
SET @dt_to = STR_TO_DATE(dateTo, '%d-%m-%Y');
Run Code Online (Sandbox Code Playgroud)
但返回一个NULL值。
如何将我的日期yyyy-MM-dd转换为 MySQL 中的格式?
编辑:
我正在创建一个过程,其中在参数中dateTo接收了 的值。它是MMMM dd, yyyy格式的日期。例如October 10, 2015。
笔记:
NULL当我使用时,整个查询不会返回:
SET @dt_to = dateTo;
Run Code Online (Sandbox Code Playgroud)